交叉编译C ++ / Objective-C ++时出错

时间:2012-02-09 22:13:26

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

我有一个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 ++对象
  3. 我认为这是某种交叉编译错误,但我不知道在哪里看。关于它可能是什么的想法?

    编辑:

    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 normal 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 / 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 /生成/产品/调试-iphonesimulator / BerkeleyDBHelloWorldSimulator.app / BerkeleyDBHelloWorldSimulator

2 个答案:

答案 0 :(得分:8)

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

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

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

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

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

检查“库搜索路径”和“框架搜索路径”,查看您未自行添加的任何路径。我在这里有XCode设置旧SDK的路径,这使链接器感到困惑。

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

答案 1 :(得分:3)

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