簡體   English   中英

交叉編譯C ++ / Objective-C ++時出錯

[英]Errors when cross compiling C++/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 ++對象

我假設它是某種交叉編譯錯誤,但我不知道在哪里看。 關於它可能是什么的想法?

編輯:

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

這些都在我的頂級項目中。 包含的庫也使用它們(它也引用了一個外部庫,並且在將它添加到我的主項目時不再找到標題路徑 - 我必須將它添加到我的主項目設置中)。

編輯2:這是失敗的構建步驟:

LD /用戶/ 用戶 /Library/Developer/Xcode/DerivedData/BerkeleyDBHelloWorldSimulator-bgnkrqnronvtkoaongfsdturoklb/Build/Products/Debug-iphonesimulator/BerkeleyDBHelloWorldSimulator.app/BerkeleyDBHelloWorldSimulator正常i386的CD /用戶/ 用戶 /文件/項目/測試/ 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 / Berkel eyDBHelloWorldSimulator -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/DerivedData/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

我們花了一些時間在評論主題中找到接近解決方案的東西,所以我將在這里總結一下:

這種類型的錯誤是由於沒有成功鏈接到正確的libstdc++.dylib (標准C ++庫)引起的。 有時,你忘記添加它,有時XCode會感到困惑。

首先,確保您確實在應用目標的設置中鏈接到它:它必須出現在“構建階段”,“鏈接二進制文件庫”中。

如果它在那里,但仍然無法鏈接,請檢查原始構建日志中是否有XCode可能隱藏的任何警告:例如關於錯誤的體系結構。 這意味着您要鏈接到錯誤的文件版本 - 例如鏈接到模擬器或OSX版本而不是iPhoneOSx.y.sdk目錄中的版本。 在過去,使用XCode 3,這很容易出錯,修復它的唯一方法是嘗試XCode提供的每一個不同的libstdc++.dylib ,直到一個工作。 除了帶有版本號的名稱外,XCode4通常只提供一個。 您通常應選擇沒有版本號的dylib。

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

檢查“庫搜索路徑”和“框架搜索路徑”,查看您未自行添加的任何路徑。 我在這里有XCode設置舊SDK的路徑,這使鏈接器感到困惑。

最后,有時只需刪除對libstdc++.dylib的引用,清理項目,退出並重新啟動XCode,然后重新添加引用即可。

確保您的代碼和庫鏈接到相同的C ++標准庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM