web-dev-qa-db-ja.com

共有ライブラリのエクスポートされたシンボルを制御するときの「gcc -fvisibility = hidden」に相当するCMakeは何ですか?

クロスプラットフォームソフトウェアをc ++で開発しました。 Linux .soはデフォルトですべてのシンボルをデフォルトでエクスポートし、_"gcc -fvisibility=hidden"_を使用してエクスポートしたすべてのシンボルを非表示に設定してから、エクスポートするクラスと関数に__attribute__(visibility("default"))を設定できます。エクスポートしたいものを制御できます。

私の質問は、CMakeを使用して、「gcc -fvisibility = hidden」コントロールとして機能させるにはどうすればよいですか?

37
sailing

コンパイラフラグを直接設定する代わりに、代わりに現在のCMakeバージョンと <LANG> _VISIBILITY_PRESET プロパティを使用する必要があります。このようにして、CMakeListsのコンパイラ固有を回避し、クロスプラットフォームの適用性を改善できます(ClangではなくGCCをサポートするなどのエラーを回避します)。

つまり、C++を使用している場合は、set(CMAKE_CXX_VISIBILITY_PRESET hidden)を呼び出してプロパティをグローバルに設定するか、set_target_properties(MyTarget PROPERTIES CXX_VISIBILITY_PRESET hidden)を呼び出して設定を特定のライブラリまたは実行可能ターゲットに制限します。 Cを使用している場合は、前述のコマンドでCXXをCに置き換えるだけです。 VISIBLITY_INLINES_HIDDEN プロパティも調査することをお勧めします。

GENERATE_EXPORT_HEADER のドキュメントには、両方のプロパティに関連するヒントと例がいくつか含まれています。

65
Joe

次のようにCmakeコンパイラにフラグを追加できます。

SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden")

これがLinuxでのみ行われることを確認するには、次のコードを使用できます。

IF(UNIX)
    IF(CMAKE_COMPILER_IS_GNUCC)
         SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden")
    ENDIF(CMAKE_COMPILER_IS_GNUCC)
ENDIF(UNIX)
5
tune2fs