主に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++ライブラリからのものです。私たちはこれらのライブラリとリンクしています:
ご注意ください:
ブースト付きのxcodeによって提案されたソリューション:リンカー(Id)可視性設定に関する警告が機能しません:「デフォルトで非表示のシンボル」は常に「はい」でした。
これは、「YES」に設定することとは関係がなく、すべてのプロジェクトで同じ値に設定することに関係があります。他のライブラリーに依存するライブラリー/プロジェクトは、適切にリンクしてエラー/警告がないようにするために、「デフォルトで非表示のシンボル」の同様の設定が必要です。
以前これに遭遇したことがあり、設定が確実に一致するようにすべてのプロジェクトのXcodeを単純に変更することで、通常は問題が解決します。コマンドラインでもコンパイルしているように聞こえるので、-fvisibility
への引数gcc
は、注意する必要があります。
tl:dr; _-fvisibility=hidden
_をgccおよびllvmコンパイラスイッチとして使用し、コンパイルするすべてのもので、依存するライブラリを含めて、理由がない限り。
-fvisibilityおよび-fvisibility-inline-hiddenコンパイルフラグの優れた紹介は、この記事の執筆時点で AppleのWebサイト で入手できます。この記事では、__attribute__((visibility("hidden")))
および__attribute__((visibility("default")))
宣言についても詳しく説明しています。
Xcodeで-fvisibility=hidden -fvisibility-inlines-hidden
を他のC++フラグに挿入します。
同様の理由でこれも取得しましたが、問題はインライン表示設定の不整合にあると思います。
を参照してくださいhttp://lists.cs.uiuc.edu/pipermail/llvmdev/2011-December/046505.html
私はすべてのインラインを非表示に設定し、警告が(ついに)消えました。