web-dev-qa-db-ja.com

リンカからの奇妙な警告(ld)

主にObj-C/Cocoaで記述されたMac OSXアプリケーションを構築しています。次に、アプリケーションは、C/C++で記述され、(MacPortsまたは通常の "./configure && make"を使用してコマンドラインで)コンパイルされたいくつかのサードパーティライブラリと静的にリンクします。これらはすべてユニバーサルバイナリです。

アプリケーションは完全に機能していますが、広告のコンパイル時に、次のような奇妙なリンカーの警告が常に表示されます。

ld: warning: direct access in ___cxx_global_var_init17 to global weak symbol __ZGVN4i18n12phonenumbers9SingletonINS0_15PhoneNumberUtilEE8instanceE 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 ___cxx_global_var_init17 to global weak symbol __ZGVN4i18n12phonenumbers9SingletonINS0_15PhoneNumberUtilEE8instanceE 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 ___cxx_global_var_init17 to global weak symbol __ZN5boost10scoped_ptrIN4i18n12phonenumbers15PhoneNumberUtilEED1Ev 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 ___cxx_global_var_init17 to global weak symbol __ZN4i18n12phonenumbers9SingletonINS0_15PhoneNumberUtilEE8instanceE 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 ___cxx_global_var_init17 to global weak symbol __ZGVN4i18n12phonenumbers9SingletonINS0_15PhoneNumberUtilEE8instanceE means the weak symbol cannot be overridden at runtime. This was likely caused by different translation units being compiled with different visibility settings.

これは、C/C++ライブラリからのものです。私たちはこれらのライブラリとリンクしています:

  1. libphonenumber 、これは明らかに5つの警告のうち4つを引き起こしています。 「cmake」を使用してコンパイルしました。
  2. ブースト(libboost_thread-mt)、1つの警告の原因。 MacPortsでコンパイルされています。
  3. MacPortsでコンパイルされたICU(libicudata、libicuuc、libicui18n)。
  4. プロトコルバッファ 、 "./ configure && make"でコンパイル。

ご注意ください:

  1. 警告にもかかわらずアプリケーションは完全に動作していますが、迷惑なので削除します。
  2. xcode with boost:linker(Id)Warning about visibility settings によって提案されたソリューションは機能しません:「デフォルトで非表示のシンボル」は常に「YES」でした。
25
ItalyPaleAle

ブースト付きのxcodeによって提案されたソリューション:リンカー(Id)可視性設定に関する警告が機能しません:「デフォルトで非表示のシンボル」は常に「はい」でした。

これは、「YES」に設定することとは関係がなく、すべてのプロジェクトで同じ値に設定することに関係があります。他のライブラリーに依存するライブラリー/プロジェクトは、適切にリンクしてエラー/警告がないようにするために、「デフォルトで非表示のシンボル」の同様の設定が必要です。

以前これに遭遇したことがあり、設定が確実に一致するようにすべてのプロジェクトのXcodeを単純に変更することで、通常は問題が解決します。コマンドラインでもコンパイルしているように聞こえるので、-fvisibilityへの引数gccは、注意する必要があります。

24
inspector-g

tl:dr; _-fvisibility=hidden_をgccおよびllvmコンパイラスイッチとして使用し、コンパイルするすべてのもので、依存するライブラリを含めて、理由がない限り。

-fvisibilityおよび-fvisibility-inline-hiddenコンパイルフラグの優れた紹介は、この記事の執筆時点で AppleのWebサイト で入手できます。この記事では、__attribute__((visibility("hidden")))および__attribute__((visibility("default")))宣言についても詳しく説明しています。

7
johnwbyrd

Xcodeで-fvisibility=hidden -fvisibility-inlines-hiddenを他のC++フラグに挿入します。

4
guest2016

同様の理由でこれも取得しましたが、問題はインライン表示設定の不整合にあると思います。

を参照してくださいhttp://lists.cs.uiuc.edu/pipermail/llvmdev/2011-December/046505.html

私はすべてのインラインを非表示に設定し、警告が(ついに)消えました。

3
Nick