簡體   English   中英

我如何針對在xcode / clang / macos中使用libc ++編譯的靜態庫編譯應用程序?

[英]How I do compile a application against a static library compiled with libc++ in xcode/clang/macos?

當我嘗試編譯測試控制台應用程序以測試同一工作區上的靜態庫上的某些功能時,我在二進制文件的鏈接階段遇到問題,只有在我選擇使用libc ++標准庫時才會發生。

丟失的符號錯誤如下:

    Undefined symbols for architecture x86_64:
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::empty() const", referenced from:
      libtorrent::torrent::replace_trackers(std::__1::vector<libtorrent::announce_entry, std::__1::allocator<libtorrent::announce_entry> > const&) in libLibOFFTorrent-xcode.a(torrent.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

xcode中的錯誤缺少靜態庫上的符號

當我在兩個目標中選擇stdlibc ++時,一切都編譯正常,它運行正常。

標准庫選項(xcode)

我的問題是:

  1. 在靜態庫上使用libc ++有一些限制嗎?
  2. 它是apple / clang ++鏈接器工具中的一個錯誤?
  3. 如何配置項目以將libc ++與我的靜態庫一起使用?
  4. 為什么鏈接器工具在靜態庫上找不到標准c ++庫的符號?(任何其他依賴的庫都是針對libc ++編譯的)
  5. 我應該忘記使用libc ++的想法嗎?

筆記:

  1. 靜態庫依賴於libboost_system,我用libc ++和libstdc ++編譯了相同的結果
  2. 當我使用'bjam'工具運行測試時它運行正常,也許jam文件選擇libstdc ++來編譯文件。
  3. 我知道更改標准庫會修復鏈接問題,我只想知道為什么會這樣。

更新 :當我在靜態lib項目中刪除對string :: empty的引用時,依賴於使用libc ++編譯並運行的項目,但它會進入無限循環。

更新2 :刪除string :: empty引用當我用libstdc ++編譯整個東西時沒有任何效果它運行正常。 沒有循環,這讓我覺得這是一個錯誤或類似的東西。

更新3 :當它編譯時,這是程序無限循環的地方: 在此輸入圖像描述

似乎你的一個依賴項( libtorrent )是針對libstdc++構建的。

檢查命名空間: std::__1::basic_string 它有__1前綴,通常表示libstdc++ )。

我可能錯了,但我認為你需要重建你的libtorrent對抗libc++如果你絕對想要使用這個。

請注意,使用stdlibc++是很常見的。

您是否有機會使用-D_LIBCPP_INLINE_VISIBILITY =“”編譯libtorrent?

我問的原因是std::string::empty()不在libc ++。dylib中,因為它標有“always_inline”。 因此,當它被使用時應該被內聯到libtorrent中。

暫無
暫無

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

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