gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:26:47 35 4
gpt4 key购买 nike

我有一个 C++ 库被一个 Objective-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

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

编辑 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 路径“/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/用户/Library/Developer/Xcode/DerivedData/BerkeleyDBHelloWorldSimulator-bgnkrqnronvtkoaongfsdturoklb/Build/Products/Debug-iphonesimulator-F/Users/用户/Library/Developer/Xcode/DerivedData/BerkeleyDBHelloWorldSimulator-bgnkrqnronvtkoaongfsdturoklb/Build产品/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/用户/Library/Developer/Xcode/派生数据/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 引起的。有时,您会忘记添加它,有时 XCode 会感到困惑。

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

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

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

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

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

关于c++ - 交叉编译 C++/Objective-C++ 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9219632/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com