3

私の iOS アプリは、Boost に依存するライブラリを使用しています。サードパーティのビルド システムを改良しているときに、このようなリンカの警告が表示されました。

ld: warning: direct access in ___cxx_global_var_init to global weak symbol
std::__1::basic_ofstream<char, std::__1::char_traits<char> >::~basic_ofstream()
means the weak symbol cannot be overridden at runtime.
This was likely caused by different translation units being compiled with different visibility settings.

この

ld: warning: direct access in __GLOBAL__I_a to global weak symbol
boost::exception_ptr::~exception_ptr()
means the weak symbol cannot be overridden at runtime.
This was likely caused by different translation units being compiled with different visibility settings.

この警告に関して、SOには他にもかなりの数の質問があることがわかりました。私は彼らのアドバイスに従い、すべてのビルドの表示設定が同じであることを確認しました (-fvisibility=hiddenおよび-fvisibility-inlines-hidden)。完全に再構築した後も、警告が表示されます。

環境:

  • Xcode 4.6.0
  • iOS SDK 6.1
  • 人気のあるgalbraithjosephs-boostoniphoneビルド スクリプトの変更されたクローンを使用して Boost をビルドする
  • ブーストバージョン 1.54.0
  • で構築-std=c++11 -stdlib=libc++
4

1 に答える 1

6

問題はBoostのビルドスクリプトclang++がコンパイラとして使われているのに、他のライブラリと自作のiOSアプリが使われていることでしたclang(他のライブラリと自作のアプリはXcodeプロジェクトで、ビルドは で作られていますclang)。

でブーストを再構築した後、警告は消えましたclang

悲しいことに、なぜこれが役に立ったのか正確にはわかりません。clang++with でコンパイルすると、コンパイラが C++ モードに切り替わり、特定の設定がオン/オフされることを認識しています。しかし、コマンド ラインで明示的にclang++指定された可視性設定をオーバーライドすることを意味するわけではありません。動作を説明するコメントまたは追加の回答を歓迎します。

于 2013-10-04T20:43:33.163 に答える