2017-05-23 1 views
0

내 응용 프로그램에서 Layout.c이라는 이름의 C 파일에 해당 라이브러리에 ABC.a이라는 정적 라이브러리를 사용하고 있습니다. init()이라는 함수가 있습니다. 그리고 도서관을 프로젝트에 연결하고 .h 파일을 추가했습니다. 프로그램은 오류없이 컴파일되지만 함수를 링크하는 동안 오류가 발생합니다. 왜?링커 명령이 종료 코드 1을 사용하여 실패했습니다. (호출을 보려면 -v를 사용하십시오.) iOS 오류

Info : 정적 라이브러리도 빌드 단계에 추가했습니다.

그리고 라이브러리는 armv7, armv7s 및 arm64 용으로 제작되었습니다. 아니오 그리고 액티브 아키텍처를 구축 : 활성화 비트 코드하지 NO

예 오류 :

Undefined symbols for architecture arm64: 
    "AMID_INIT(int*, int*, int)", referenced from: 
     -[ViewController microphone:hasAudioReceived:withBufferSize:withNumberOfChannels:] in Test_lto.o 
    "amid_Val(float const*, int, int*, int, unsigned int)", referenced from: 
     -[ViewController microphone:hasAudioReceived:withBufferSize:withNumberOfChannels:] in Test_lto.o 

이에 대한 간 이일을 도와주세요.

+1

추측 컨데, 라이브러리의 헤더에는 C++ 가드가 없으며 객관적인 C++ 프로그램에서 사용하고 있습니다. 'extern "C"{\ n # import'lib.h '\ n}에서'#import'lib.h''를 래핑하여 그 것이 도움이되는지 확인하십시오. – Petesh

+0

시도해보십시오 : 아키텍처 및 유효한 아키텍처가 괜찮은 경우 다른 링커 플래그에 $ (상속)를 추가했는지 확인할 수 있습니다. – KKRocks

+0

@Petesh 댓글은 맞는 말입니다. 멋진 남자. 당신은 많은 시간을 절약했습니다. 감사. 답을 줘 내가 확인해. –

답변

2

.a 파일이 c 파일에서 생성되었다는 사실을 기반으로합니다. 링커 오류 :

"AMID_INIT(int*, int*, int)", referenced from: 
     -[ViewController microphone:hasAudioReceived:withBufferSize:withNumberOfChannels:] in Test_lto.o 

AMID_INIT 정의는 C에서 온 것을 나타냅니다 ++/오브젝티브 C++ 파일 - C 파일이 루틴의 매개 변수에 대한 정보를 가지고 있지 않기 때문에이있다.

이로부터 라이브러리 헤더 파일에 C++ 가드가 없었 음을 추측 할 수있었습니다. 이 경우

세 가지 방법 - 같은과 C++ 코드에서 라이브러리 헤더 파일의 모든 수입을 포장 : 포함,

extern "C" { 
#import "lib.h" 
} 

또는 lib.hpp 파일을 만듭니다

#pragma once 
extern "C" { 
#import "lib.h" 
} 

#import 'lib.hpp'을 대신 lib.h 파일을 맹 글링 방지 표준 이름을 추가하여 수정하십시오.

... 별 근처 lib.h의 t :

#ifdef __cplusplus 
extern "C" { 
#endif 

... lib.h의 니어 엔드 : 모든 루틴에 의해 제공되는 것을 선언하여

#ifdef __cplusplus 
} 
#endif 

이것은 당신이 모두 CC++ 컴파일러와 lib.h를 계속 사용 할 수 있습니다 lib.hC++ 연쇄보다 C 연계를 사용하여 노출된다.

관련 문제