テスト コンソール アプリケーションをコンパイルして、同じワークスペースのスタティック ライブラリでいくつかの機能をテストしようとすると、バイナリのリンク段階で問題が発生します。これは、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)
両方のターゲットで stdlibc++ を選択すると、すべてが正常にコンパイルされ、正常に実行されます。
私の質問は次のとおりです。
- 静的ライブラリで libc++ を使用する際にいくつかの制限がありますか?
- Apple/clang++ リンカ ツールのバグですか?
- 静的ライブラリで libc++ を使用するようにプロジェクトを構成するにはどうすればよいですか?
- リンカー ツールが静的ライブラリで標準の C++ ライブラリのシンボルを検出しないのはなぜですか? (依存する他のすべてのライブラリは libc++ に対してコンパイルされます)
- libc ++を使用するという考えを忘れるべきですか?
ノート:
- 静的ライブラリは libboost_system に依存しています。魔女は libc++ と libstdc++ でコンパイルして同じ結果を得ました
- 「bjam」ツールでテストを実行すると、正常に実行されます。おそらく、jam ファイルは libstdc++ を選択してファイルをコンパイルします。
- 標準ライブラリを変更するとリンクの問題が修正されることはわかっていますが、その理由を知りたいだけです。
UPDATE : 静的 lib プロジェクトで string::empty への参照を削除すると、依存するプロジェクトは libc++ で正常にコンパイルされて実行されますが、無限ループに入ります。
更新 2 : string::empty 参照を削除しても、libstdc++ で全体をコンパイルしても問題はありません。ループはありません。これはバグか何かだと思います。
更新 3 : コンパイルすると、プログラムが無期限にループする場所になります。