2012-01-21 3 views
7

Xcode를 사용하여 정적 C++ 라이브러리에 링크하는 Objective-C 데스크탑 응용 프로그램을 작성하려고합니다. 나는 애플의 clang 컴파일러를 사용하고있다. 다음과 같은 링커 오류가 발생합니다 :Objective-C 응용 프로그램을 C++ 정적 라이브러리에 연결

Apple clang version 3.0 (tags/Apple/clang-211.12) (based on LLVM 3.0svn) 
Target: x86_64-apple-darwin11.2.0 
Thread model: posix 
"/Developer/usr/bin/ld" -demangle -dynamic -arch x86_64 -macosx_version_min 10.7.0 -syslibroot /Developer/SDKs/MacOSX10.7.sdk -o /Users/andrew/Library/Developer/Xcode/DerivedData/sl-marketplace-analysis-exomzzahbygseghhwoeclcvpooeo/Build/Products/Debug/sl marketplace analyitics.app/Contents/MacOS/sl marketplace analyitics -lcrt1.10.6.o -L/Users/andrew/Library/Developer/Xcode/DerivedData/sl-marketplace-analysis-exomzzahbygseghhwoeclcvpooeo/Build/Products/Debug -L/Users/andrew/Projects/sl-marketplace-analysis/platform/mac/sl marketplace analyitics/../../../../../Library/Developer/Xcode/DerivedData/sl-marketplace-analysis-exomzzahbygseghhwoeclcvpooeo/Build/Products/Debug -filelist /Users/andrew/Library/Developer/Xcode/DerivedData/sl-marketplace-analysis-exomzzahbygseghhwoeclcvpooeo/Build/Intermediates/sl marketplace analyitics.build/Debug/sl marketplace analyitics.build/Objects-normal/x86_64/sl marketplace analyitics.LinkFileList -framework Cocoa -lcore -lSystem /Developer/usr/bin/../lib/clang/3.0/lib/darwin/libclang_rt.osx.a -F/Users/andrew/Library/Developer/Xcode/DerivedData/sl-marketplace-analysis-exomzzahbygseghhwoeclcvpooeo/Build/Products/Debug 
Undefined symbols for architecture x86_64: 
    "std::ios_base::Init::~Init()", referenced from: 
     ___cxx_global_var_init in libcore.a(test.o) 
    "std::ios_base::Init::Init()", referenced from: 
     ___cxx_global_var_init in libcore.a(test.o) 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

C++ 표준 라이브러리와 연결되지 않은 것처럼 보입니다. 이것이 문제인가? 만약 그렇다면, 내가 그것을 어떻게 연결시킬 수 있는가?

업데이트 : 나는 빌드에 빈 CPP 파일을 추가하면

다음 모든 컴파일 잘 실행됩니다. 링커에게 C++ 표준 라이브러리와 링크하도록 지시하는 방법이 필요합니다. Xcode에서 모든 빌드 설정을 살펴 보았지만 도움이되는 것을 찾을 수 없습니다.

답변

17

를 추가해보십시오 -lstdC++ 또는 -lC++ "다른 링커 플래그"에 :

enter image description here

+0

동일한 문제가 발생하여 하루 종일이 솔루션을 찾고있었습니다. . 그것을 공유해 주셔서 감사합니다, 매력처럼 작동합니다. –

+1

감사합니다 !!! d Objective-C, C++ 및 Objective-C++의 조합 인 정적 라이브러리.라이브러리 자체는 제작시이 플래그를 포함하지 않지만 iOS 응용 프로그램에서 라이브러리를 사용할 때 어떤 이유로 필요합니다. 나는 이유를 모른다. – jocull

+0

@jocull : 정적 라이브러리를 만들면 결과 파일이 링크되지 않으므로 아카이브가 최종 응용 프로그램의 일부로 링크 될 때까지 라이브러리가 필요하지 않습니다. –

1

libcore.astd::ios_base 네임 스페이스에 Init이라는 클래스를 찾고 있습니다. 나는 std::ios_base::Init이 표준 클래스라고 생각하지 않는다.

이외에도 libcore.a에는 실제로 x86_64 코드가 포함되어 있는지 확인할 수 있습니다. file 명령을 사용하여 확인할 수 있습니다. 예를 들면 다음과 같습니다 file 명령 출력은 "for architecture x86_64"라인을 포함하지 않는 경우

$ file /usr/lib/libz.dylib 
/usr/lib/libz.dylib: Mach-O universal binary with 2 architectures 
/usr/lib/libz.dylib (for architecture x86_64): Mach-O 64-bit dynamically linked shared library x86_64 
/usr/lib/libz.dylib (for architecture i386): Mach-O dynamically linked shared library i386 

, 당신은 64 비트 실행 파일을 생성하기 위해 라이브러리를 사용할 수 없습니다. "설정 빌드"아래 (C++ 런타임 정적 라이브러리가 기대에 따라)

+0

나는 그 라이브러리를 제어 할 수 있습니다. (동일한 Xcode 작업 공간에서 빌드하고 있습니다 .X86_64로 빌드되었습니다.) – drewag

-1

다른 링커 플래그 -lstdC++ Xcode5에서 저를 도왔습니다. 그러나 애플 LLVM 5.0에서 비슷한 일을 찾아 - Lnaguage - C++ 기본 설정은 의 libC++ (LLVM C++ 표준 ~ blabla)이었다 지금이 된 libstdc에 ++ (GNU 일)

그것을 변경

연결하는 데 오류가 없습니다 !!! 이제는 잘 돌아가는 것을 알아야합니다.

어쨌든 조언을 주셔서 감사합니다. 엑스 코드 (6)과 같은 문제를 가졌

+0

같은 문제 - -lstdC++는 Xcode5에서 효과가없는 것 같습니다. 이 대답의 제안 된 수정 사항은 아무런 영향을 미치지 않습니다. – Adam

+0

예, libC++를 사용하는 경우 libC++에 링크해야합니다. libstdC++ (오래되었지만 더 이상 사용되지 않음)를 사용하는 경우 libstdC++에 링크해야합니다. –

2

, 내가 연결하여 그것을 해결했다 "된 libstdC++를. 6.0.9.dylib"에서 "링크 바이너리 라이브러리에"-lstdC++에 "기타를 추가하는 단계 &를 구축 링커 플래그 "빌드 설정에서

+0

감사합니다. Urmi,이 문제가 해결되었지만 "기타 링커 플래그"에 -lstdC++를 추가 할 필요는 없습니다. 내 경우에는 응용 프로그램 타겟 자체가 순수한 Obj-C이며 C++이나 언어 또는 표준 라이브러리가 필요하지 않습니다. 그러나 C++를 많이 사용하는 타사 정적 라이브러리 (예 : Google에서 구매 한 오디오/비디오 엔진)와 연결해야합니다. 정적 라이브러리이므로 C++ 표준 라이브러리를 앱에 추가하여 "도움을"주어야합니다. 어떤 이유로 Xcode는 자동으로이 작업을 수행하지 않습니다. –

관련 문제