【发布时间】: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)
到目前为止,我发现此类错误可能由以下原因引起:
- 文件类型为 .m 而不是 .mm
- 在我的 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++