将Objective-C应用程序链接到C ++静态库

时间:2012-01-21 03:20:14

标签: c++ xcode linker static-libraries clang

我正在尝试使用Xcode构建一个链接静态C ++库的Objective-C桌面应用程序。我正在使用Apple的clang编译器。我收到以下链接器错误:

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 ++ std库。这是问题所在,如果是这样,我如何确保它与之相关联?

更新

如果我在构建中添加一个空白的cpp文件,那么一切都会编译并运行正常。我似乎只需要一种方法告诉链接器链接到C ++ std库。我试过查看Xcode中的所有构建设置,但似乎找不到任何有用的东西。

4 个答案:

答案 0 :(得分:16)

尝试添加-lstdc ++或-lc ++(取决于您的静态库所期望的C ++运行时) 到“Build Setting”下的“Other Linker Flags”:

enter image description here

答案 1 :(得分:3)

与Xcode 6有同样的问题,我通过链接" libstdc ++。6.0.9.dylib "解决了这个问题。在" 链接二进制文件库"构建阶段&将 -lstdc ++ 添加到" 其他链接标记"在构建设置

答案 2 :(得分:1)

libcore.aInit命名空间中查找名为std::ios_base的类似乎很奇怪。我认为std::ios_base::Init不是标准类。

除此之外,您可能需要检查libcore.a实际上是否包含x86_64代码。您可以使用file命令进行检查。例如:

$ 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

如果file命令输出不包含“for architecture x86_64”行,则无法使用该库创建64位可执行文件。

答案 3 :(得分:-1)

其他链接器标志-lstdc ++ 在Xcode5中没有帮助我。 但在 Apple LLVM 5.0中找到类似的东西 - Lnaguage - C ++

默认设置为 libc ++(LLVM C ++标准~blabla)并将其更改为 libstdc ++(GNU thing)

现在链接没有错误!现在我必须发现它运行良好。

无论如何,谢谢你的建议。