【问题标题】:Link Objective-C application to C++ static library将 Objective-C 应用程序链接到 C++ 静态库
【发布时间】:2012-02-15 13:09:47
【问题描述】:

我正在尝试使用 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++ 标准库。这是问题吗?如果是,我如何确保它链接到它?

更新

如果我在构建中添加一个空白 cpp 文件,那么一切都会编译并运行良好。我似乎只是需要一种方法来告诉链接器链接到 C++ 标准库。我已尝试查看 Xcode 中的所有构建设置,但似乎找不到任何帮助。

【问题讨论】:

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


    【解决方案1】:

    尝试添加 -lstdc++ 或 -lc++(取决于您的静态库期望的 C++ 运行时) 到“构建设置”下的“其他链接器标志”:

    【讨论】:

    • 我遇到了同样的问题,整天都在寻找这个解决方案。感谢分享,很有魅力
    • 谢谢!!!我有一个静态库,它是 Objective-C、C++ 和 Objective-C++ 的组合。库本身在构建时不包含此标志,但由于某种原因在我的 iOS 应用程序中使用该库时需要此标志。我不知道为什么。
    • @jocull:当您构建静态库时,不会链接生成的文件,因此在归档作为最终应用程序的一部分链接之前不需要库。
    • Xcode5 似乎再次打破了这一点。 -lstdc++ 不再起作用 - Xcode5 只是拒绝允许任何使用任何 C++ 的库。 Apple 的精彩(不存在)测试再次来袭! ;)
    • 注意,如果您不确定,请在您的静态库中搜索“CLANG_CXX_LIBRARY”的构建设置。如果它的 libc++ 然后使用 -lc++ 如果它的 libstdc++ 然后使用:-lstdc++
    【解决方案2】:

    与 Xcode 6 有同样的问题,我通过在“Link Binary with Libraries”构建阶段链接“libstdc++.6.0.9.dylib”解决了这个问题&将 -lstdc++ 添加到 Build Setting 下的“Other Linker Flags

    【讨论】:

    • 感谢 Urmi,这解决了我的问题,尽管我不需要将 -lstdc++ 添加到“其他链接器标志”。就我而言,应用程序目标本身是纯 Obj-C,不需要 c++,既不需要语言也不需要标准库。但是,我需要链接到大量使用 C++ 的外部 3rd 方静态库(例如,我们购买的音频/视频引擎)。由于它们是静态库,我们必须通过将 C++ 标准库添加到我们的应用程序来“帮助它们”。由于某种原因,Xcode 不会自动执行此操作。
    【解决方案3】:

    libcore.astd::ios_base 命名空间中寻找一个名为Init 的类似乎很奇怪。我不认为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 位可执行文件。

    【讨论】:

    • 我也可以控制那个库(我在同一个 Xcode 工作区中构建它。它是用 x86_64 构建的。
    【解决方案4】:

    其他链接器标志 -lstdc++ 在 Xcode5 中对我没有帮助。 但是在 Apple LLVM 5.0 - Lnaguage - C++

    中找到类似的东西

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

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

    还是谢谢你的建议。

    【讨论】:

    • 同样的问题 - -lstdc++ 似乎在 Xcode5 中没有效果。此答案中建议的修复没有效果(也不应该)
    • 是的,如果你使用 libc++,你应该链接到 libc++。如果您使用 libstdc++(它是旧的且已弃用,所以不要使用),您应该链接到 libstdc++。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    • 1970-01-01
    • 2013-10-04
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    相关资源
    最近更新 更多