CMake: CMAKE_AIX_EXPORT_ALL_SYMBOLS 変数で AIX シンボルエクスポートを制御する


CMAKE_AIX_EXPORT_ALL_SYMBOLS は、CMake のターゲットプロパティ AIX_EXPORT_ALL_SYMBOLS のデフォルト値を設定する変数です。このプロパティは、AIX 上で生成される共有ライブラリと、ENABLE_EXPORTS ターゲットプロパティが設定された実行可能ファイルからすべてのシンボルを自動的にエクスポートするかどうかを制御します。

デフォルト値

CMAKE_AIX_EXPORT_ALL_SYMBOLS のデフォルト値は TRUE です。つまり、AIX 上で生成される共有ライブラリと実行可能ファイルからすべてのシンボルが自動的にエクスポートされます。

使用方法

CMAKE_AIX_EXPORT_ALL_SYMBOLS 変数は、CMake の CMakeLists.txt ファイル内で設定できます。以下の例は、この変数を FALSE に設定し、すべてのシンボルのエクスポートを無効にする方法を示しています。

set(CMAKE_AIX_EXPORT_ALL_SYMBOLS FALSE)
  • AIX 上でシンボルをエクスポートする方法の詳細については、CMake のドキュメントを参照してください。
  • 特定のシンボルのみをエクスポートしたい場合は、TARGET_LINK_LIBRARIES コマンドと PUBLIC_SYMBOLS オプションを使用することができます。
  • AIX_EXPORT_ALL_SYMBOLS ターゲットプロパティは、個々のターゲットレベルで設定することもできます。これは、target_properties() コマンドを使用して行うことができます。

以下の例は、CMAKE_AIX_EXPORT_ALL_SYMBOLS 変数を FALSE に設定し、mylibrary という名前の共有ライブラリを生成する方法を示しています。このライブラリは、mysymbol という名前のシンボルのみをエクスポートします。

set(CMAKE_AIX_EXPORT_ALL_SYMBOLS FALSE)

add_library(mylibrary mysource.c)

target_link_libraries(mylibrary PUBLIC "mysymbol")


サンプル 1: すべてのシンボルをエクスポートする

# CMakeLists.txt

cmake_minimum_required(VERSION 3.17)

project(myproject)

add_library(mylibrary mysource.c)

サンプル 2: 特定のシンボルのみをエクスポートする

# CMakeLists.txt

cmake_minimum_required(VERSION 3.17)

project(myproject)

set(CMAKE_AIX_EXPORT_ALL_SYMBOLS FALSE)

add_library(mylibrary mysource.c)

target_link_libraries(mylibrary PUBLIC "mysymbol")

以下のコードは、target_properties() コマンドを使用して、mytarget1 という名前のターゲットの AIX_EXPORT_ALL_SYMBOLS プロパティを FALSE に設定します。mytarget2 という名前のターゲットは、デフォルトの TRUE 値を使用します。

# CMakeLists.txt

cmake_minimum_required(VERSION 3.17)

project(myproject)

add_executable(mytarget1 mysource1.c)
target_properties(mytarget1 PROPERTIES AIX_EXPORT_ALL_SYMBOLS FALSE)

add_executable(mytarget2 mysource2.c)
  • AIX 上でのシンボルエクスポートの詳細については、CMake のドキュメントを参照してください。
  • CMake の最新バージョンを使用していることを確認してください。
  • 実際のコードは、プロジェクトの要件に応じて変更する必要があります。


TARGET_LINK_LIBRARIES コマンドと PUBLIC_SYMBOLS オプションを使用する

この方法は、特定のシンボルのみをエクスポートしたい場合に有効です。以下の例は、mysymbol という名前のシンボルのみをエクスポートする mylibrary という名前の共有ライブラリを生成する方法を示しています。

add_library(mylibrary mysource.c)

target_link_libraries(mylibrary PUBLIC "mysymbol")

個々のターゲットレベルで AIX_EXPORT_ALL_SYMBOLS ターゲットプロパティを設定する

この方法は、プロジェクト内の異なるターゲットで異なるエクスポート設定を使用したい場合に有効です。以下の例は、mytarget1 という名前のターゲットの AIX_EXPORT_ALL_SYMBOLS プロパティを FALSE に設定し、mytarget2 という名前のターゲットはデフォルトの TRUE 値を使用する方法を示しています。

add_executable(mytarget1 mysource1.c)
target_properties(mytarget1 PROPERTIES AIX_EXPORT_ALL_SYMBOLS FALSE)

add_executable(mytarget2 mysource2.c)

CMAKE_EXE_LINKER_FLAGS または CMAKE_SHARED_LINKER_FLAGS 変数を使用する

この方法は、すべてのシンボルをエクスポートする必要があるが、CMAKE_AIX_EXPORT_ALL_SYMBOLS 変数をグローバルに設定したくない場合に有効です。以下の例は、すべてのシンボルをエクスポートする mylibrary という名前の共有ライブラリを生成する方法を示しています。

add_library(mylibrary mysource.c)

set_property(TARGET mylibrary PROPERTY LINKER_LANGUAGE CXX)
set_target_properties(mylibrary PROPERTIES CXX_EXE_LINKER_FLAGS "-Wl,--export-all-symbols")

ハンドコーディングシンボルエクスポート

これは、最も低レベルの方法ですが、最も柔軟性があります。以下の例は、mysymbol という名前のシンボルをエクスポートする mylibrary という名前の共有ライブラリを生成する方法を示しています。

add_library(mylibrary mysource.c)

set_property(TARGET mylibrary PROPERTY LINKER_LANGUAGE CXX)

add_custom_command(
    TARGET mylibrary
    POST_BUILD
    COMMAND ${CMAKE_CXX_COMPILER} -Wl,--export-all-symbols -o $<TARGET_FILE_DIR>/mylibrary.symbols $<TARGET_FILE_PATH>
)

最適な方法の選択

使用する方法は、プロジェクトの要件によって異なります。一般的には、TARGET_LINK_LIBRARIES コマンドと PUBLIC_SYMBOLS オプションを使用するのが最も簡単で柔軟な方法です。

  • AIX 上でのシンボルエクスポートの詳細については、CMake のドキュメントを参照してください。
  • CMake の最新バージョンを使用していることを確認してください。
  • 実際のコードは、プロジェクトの要件に応じて変更する必要があります。