4

テスト コンソール アプリケーションをコンパイルして、同じワークスペースのスタティック ライブラリでいくつかの機能をテストしようとすると、バイナリのリンク段階で問題が発生します。これは、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. 標準ライブラリを変更するとリンクの問題が修正されることはわかっていますが、その理由を知りたいだけです。

UPDATE : 静的 lib プロジェクトで string::empty への参照を削除すると、依存するプロジェクトは libc++ で正常にコンパイルされて実行されますが、無限ループに入ります。

更新 2 : string::empty 参照を削除しても、libstdc++ で全体をコンパイルしても問題はありません。ループはありません。これはバグか何かだと思います。

更新 3 : コンパイルすると、プログラムが無期限にループする場所になります。ここに画像の説明を入力

4

2 に答える 2

1

依存関係 ( libtorrent) の 1 つが に対してビルドされているようlibstdc++です。

名前空間を確認してください: std::__1::basic_string. __1プレフィックスがあり、通常は ) を示しlibstdc++ます。

私は間違っているかもしれませんが、絶対にこれを使いたいのであれば、あなたのlibtorrent反対を再構築する必要があると思います.libc++

を使用するのはかなり一般的であることに注意してくださいstdlibc++

于 2013-02-11T00:46:53.977 に答える
0

-D_LIBCPP_INLINE_VISIBILITY="" を指定して libtorrent をコンパイルしましたか?

私が尋ねる理由はstd::string::empty()、「always_inline」でマークアップされているため、libc++.dylib に含まれていないためです。そのため、使用時に libtorrent にインライン化されているはずです。

于 2013-02-11T03:33:54.643 に答える