2012-02-09 128 views
7

我有一个C++库被Objective-C++项目引用。该库自行编译并且Objective-C++项目编译正常,直到我从库中实例化第一个类(使用对象指针)。在使用我的库中的类之前,我引用了不会导致问题的stl string对象。交叉编译时出错C++/Objective-C++

,我发现了以下错误:

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的文件类型来代替。毫米
  2. 创建我的Objective-C++ C++对象,而无需使用指针

我假设它的索姆e类交叉编译错误,但我不知道在哪里寻找。想法可能是什么?

编辑:

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

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

编辑2: 下面是构建步骤失败:

LD /用户/ 用户 /库/开发商/ Xcode中/ DerivedData/BerkeleyDBHelloWorldSimulator-bgnkrqnronvtkoaongfsdturoklb /编译/产品/调试-iphonesimulator/BerkeleyDBHelloWorldSimulator。应用程序/ BerkeleyDBHelloWorldSimulator正常I386 坎德拉/用户/用户 /文件/项目/测试/ 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 /开发商/ Xcode中/ DerivedData/BerkeleyDBHelloWorldSimulator-bgnkrqnronvtkoaongfsdturoklb /编译/产品/调试-iphonesimulator -F /用户/用户 /库/开发商/ Xcode中/ DerivedData/BerkeleyDBHelloWorldSimulator-bgnkrqnronvtkoaongfsdturoklb /编译/产品/调试-iphonesimulator -filelist /用户/ 用户 /Library/Developer/Xcode/DerivedData/BerkeleyDBHelloWorldSimulator-bgnkrqnronvtkoaongfsdturoklb/Build/Intermediates/BerkeleyDBHelloWorldSimulator.build/Debug-iphonesimulator/BerkeleyDBHelloWorldSimulator.build/Objects-normal/i386/BerkeleyDBHelloWorldSimulator.LinkFileList -mmacosx版本分钟= 10 。 6 -Xlinker -objc_abi_version -Xlinker 2 -stdlib = libc的++ -Xlinker -no_implicit_dylibs -D__IPHONE_OS_VERSION_MIN_REQUIRED = 50000 -lstdC++ /用户/用户 /库/开发商/ Xcode中/ DerivedData/BerkeleyDBHelloWorldSimulator-bgnkrqnronvtkoaongfsdturoklb /建造/产品/调试-iphonesimulator/libBerkeleyDB .a -framework UIKit -framework Foundation -framework CoreGraphics -o/Users/user/Library/Developer/Xcode/DerivedData/BerkeleyDBHelloWorldSimulator -bgnkrqnronvtkoaongfsdturoklb/Build/Products/Debug-iphonesimulator/BerkeleyDBHelloWorldSimulator。应用程序/ BerkeleyDBHelloWorldSimulator

+0

这些都不是整个错误,它将有助于引用它们的全部。虽然它们看起来像链接错误,但不是编译错误,所以你确定你正在链接到C++标准库? (libstdC++。dylib) – pmdj 2012-02-09 22:40:31

+0

我剪掉的唯一东西就是库的名称。这是一个静态库,但不是一个dylib(我正在为iOS编译)。 – mydogisbox 2012-02-09 22:42:46

+0

应该有*上面的*引用“行”,它会告诉你实际的错误。 (我仍怀疑链接错误)链接您的库或整体项目时发生错误吗?您的库是否与libstdC++或您的应用程序链接?或两者? – pmdj 2012-02-10 11:05:33

回答

8

它采取了我们一些时间去做到接近在评论线程的解决方案,所以我要在这里总结一下:

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

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

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

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

检查“库搜索路径”和“框架搜索路径”以查找您没有添加的任何路径。我已经让XCode在这里设置了旧版SDK的路径,这让连接器感到困惑。

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

+0

很好的完整答案。 – mydogisbox 2012-02-10 18:26:41

+1

我重新检查了我的库,结果是libstdC++。dylib是对libstdC++的引用。6.dylib它是对libstdC++的引用。6.0.9.dylib因此可能xcode不知道如何解析2级间接寻址。 – mydogisbox 2012-02-10 18:50:09

+0

它通常应该能够处理两个级别的符号链接。我能想到的是,它实际上是在查看另一个目录中具有相同名称的文件。链接到libstdC++。6是一个完全可以接受的解决方案,所以就这么做吧。 – pmdj 2012-02-11 11:00:42

3

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

+0

我认为他们这样做。我的图书馆项目在我的另一个项目中,我的理解是,在这种情况下,图书馆使用主项目的设置。 – mydogisbox 2012-02-10 02:47:50