【问题标题】:Errors when cross compiling C++/Objective-C++交叉编译 C++/Objective-C++ 时出错
【发布时间】:2012-02-09 22:13:26
【问题描述】:

我有一个 Objective-C++ 项目引用的 C++ 库。该库可以自行编译,Objective-C++ 项目也可以正常编译,直到我从库中实例化第一个类(使用对象指针)。在使用我的库中的类之前,我引用了 stl string 没有引起问题的对象。

我收到以下错误:

Undefined symbols for architecture i386:
  "std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)", referenced from:
      __verify_callback_c in *************.a(cxx_db.o)
      DbEnv::_stream_message_function(__db_env const*, char const*) in *************.a(cxx_env.o)
      DbEnv::_stream_error_function(__db_env const*, char const*, char const*) in *************.a(cxx_env.o)
  "std::basic_ios<char, std::char_traits<char> >::fail() const", referenced from:
      __verify_callback_c in *************.a(cxx_db.o)
  "std::ios_base::Init::Init()", referenced from:
      __static_initialization_and_destruction_0(int, int) in *************.a(cxx_db.o)
      __static_initialization_and_destruction_0(int, int) in *************.a(cxx_dbc.o)
      __static_initialization_and_destruction_0(int, int) in *************.a(cxx_dbt.o)
      __static_initialization_and_destruction_0(int, int) in *************.a(cxx_env.o)
      __static_initialization_and_destruction_0(int, int) in *************.a(cxx_mpool.o)
      __static_initialization_and_destruction_0(int, int) in *************.a(cxx_txn.o)
      __static_initialization_and_destruction_0(int, int) in *************.a(cxx_lock.o)
      ...
  "std::ios_base::Init::~Init()", referenced from:
      ___tcf_0 in *************.a(cxx_db.o)
      ___tcf_0 in *************.a(cxx_dbc.o)
      ___tcf_0 in *************.a(cxx_dbt.o)
      ___tcf_0 in *************.a(cxx_env.o)
      ___tcf_0 in *************.a(cxx_mpool.o)
      ___tcf_0 in *************.a(cxx_txn.o)
      ___tcf_0 in *************.a(cxx_lock.o)
      ...
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

到目前为止,我发现此类错误可能由以下原因引起:

  1. 文件类型为 .m 而不是 .mm
  2. 在我的 Objective-C++ 中创建一个 C++ 对象而不使用指针

我假设这是某种交叉编译错误,但我不知道去哪里找。关于它可能是什么的想法?

编辑:

Build Settings:
C++ Standard Library = libc++
C++ Language Dialect = c++0x

这些在我的顶级项目中。包含的库也在使用这些(它也引用了外部库,并且在将其添加到我的主项目时不再找到标题路径 - 我必须将其添加到我的主项目设置中)。

编辑 2: 这是失败的构建步骤:

Ld /Users/user/Library/Developer/Xcode/DerivedData/BerkeleyDBHelloWorldSimulator-bgnkrqnronvtkoaongfsdturoklb/Build/Products/Debug-iphonesimulator/BerkeleyDBHelloWorldSimulator.app/BerkeleyDBHelloWorldSimulator 正常 i386 cd /Users/user/Documents/Projects/Tests/BerkeleyDBHelloWorldSimulator setenv MACOSX_DEPLOYMENT_TARGET 10.6 setenv PATH "/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/clang++ -arch i386 -isysroot /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.0.sdk -L/Users/user em>/Library/Developer/Xcode/DerivedData/BerkeleyDBHelloWorldSimulator-bgnkrqnronvtkoaongfsdturoklb/Build/Products/Debug-iphonesimulator -F/Users/user/Library/Developer/Xcode/DerivedData/BerkeleyDBHelloWorldSimulator-bgnkrqnronvtkoaongfsdturoklb/Build/ Products/Debug-iphonesimulator -filelist /Users/user/Library/Developer/Xcode/DerivedData/BerkeleyDBHelloWorldSimulator-bgnkrqnronvtkoaongfsdturoklb/Build/Intermediates/BerkeleyDBHelloWorldSimulator.build/Debug-iphonesimulator/BerkeleyDBHelloWorldSimulator.build/Objects-normal /i386/BerkeleyDBHelloWorldSimulator.LinkFileList -mmacosx-version-min=10.6 -Xlinker -objc_abi_version -Xlinker 2 -stdlib=libc++ -Xlinker -no_implicit_dylibs -D__IPHONE_OS_VERSION_MIN_REQUIRED=50000 -lstdc++ /Users/user/Library/Developer /Xcode/派生Data/BerkeleyDBHelloWorldSimulator-bgnkrqnronvtkoaongfsdturoklb/Build/Products/Debug-iphonesimulator/libBerkeleyDB.a -framework UIKit -framework Foundation -framework CoreGraphics -o /Users/user/Library/Developer/Xcode/DerivedData/BerkeleyDBHelloWorldSimulator- bgnkrqnronvtkoaongfsdturoklb/Build/Products/Debug-iphonesimulator/BerkeleyDBHelloWorldSimulator.app/BerkeleyDBHelloWorldSimulator

【问题讨论】:

  • 这些不是全部错误,引用全部错误会有所帮助。它们看起来像链接错误,而不是编译错误,所以你确定你链接的是 C++ 标准库吗? (libstdc++.dylib)
  • 我唯一剪掉的就是图书馆的名字。不过它是一个静态库,而不是 dylib(我正在为 iOS 编译)。
  • “引用自”行上方应该有一些东西,它会告诉你实际的错误。 (我仍然怀疑链接错误)链接您的库或整个项目时是否发生错误?您的库是否链接到 libstdc++ 或您的应用程序?还是两者兼而有之?
  • 你是对的。我正在使用未扩展列表中的错误。我现在修好了。
  • 如果相关,我的库正在引用 Berkeley BD 库,但我直接从 Objective C++ 代码引用该库没有问题。

标签: c++ compiler-errors objective-c++


【解决方案1】:

我们花了一些时间在 cmets 线程中找到接近解决方案的东西,所以我将在这里总结一下:

此类错误是由于未成功链接到正确的 libstdc++.dylib(标准 C++ 库)引起的。有时,您忘记添加它,有时 XCode 会感到困惑。

首先,确保您确实在应用程序目标的设置中链接到它:它必须出现在“构建阶段”、“将二进制文件与库链接”中。

如果它在那里,但仍然无法链接,请检查原始构建日志以查看 XCode 可能对您隐藏的任何警告:例如关于错误的架构。这意味着您链接到文件的错误版本 - 例如链接到模拟器或 OSX 版本,而不是 iPhoneOSx.y.sdk 目录中的链接。在过去,使用 XCode 3,这真的很容易出错,而解决它的唯一方法是尝试 XCode 提供的每一个不同的libstdc++.dylib,直到一个工作正常为止。 XCode4 通常只提供一个,除了带有版本号的名称。您通常应该选择不带版本号的 dylib。

确保所有可能链接到libstdc++.dylib 的子项目在同一位置使用同一版本。

检查“库搜索路径”和“框架搜索路径”以查找不是您自己添加的任何路径。我在这里设置了旧 SDK 的 XCode 路径,这使链接器感到困惑。

最后,有时只需删除对 libstdc++.dylib 的引用,清理项目,退出并重新启动 XCode,然后重新添加引用会有所帮助。

【讨论】:

  • 我重新检查了我的库,结果发现 libstdc++.dylib 是对 libstdc++.6.dylib 的引用,它是对 libstdc++.6.0.9.dylib 的引用,所以 xcode 可能不知道如何解决2 级间接。
  • 它通常应该能够处理 2 级符号链接。我能想到的只是它实际上正在查看另一个目录中具有相同名称的文件。不过,链接到 libstdc++.6 是一个完全可以接受的解决方案,所以继续吧。
  • 所以我会想到。第二个链接一定有什么不同: ls -l libstdc++.* -rwxr-xr-x 1 root wheel 1551312 Sep 16 01:23 libstdc++.6.0.9.dylib lrwxr-xr-x 1 root wheel 21 Jan 22 15 :27 libstdc++.6.dylib -> libstdc++.6.0.9.dylib lrwxr-xr-x 1根轮17 Jan 22 15:27 libstdc++.dylib -> libstdc++.6.dylib
  • 对我来说看起来不错。您可以从 XCode 构建日志中复制并粘贴失败的构建的链接器命令行吗?也许我能发现什么。
  • 抱歉,我刚刚发现您指定了 clang 的 libc++ - 作为测试,尝试将设置切换到 libstdc++。我从未使用过 libc++,所以我不确定它有多完整,尤其是在 OSX 10.6 上。它没有解释为什么当您选择特定版本的 libstdc++ 时一切正常 - 也许在 clang 链接器中有一些特殊情况?哦,谢谢你的赏金。不确定这是否合理,我们还没有 100% 弄清楚。 :-)
【解决方案2】:

确保您的代码和库都链接到同一个 C++ 标准库。

【讨论】:

  • 我认为他们有。我的库项目在我的另一个项目中,据我了解,在这种情况下,库使用主项目上的设置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-03
  • 1970-01-01
相关资源
最近更新 更多