【CMake】Android向けRTTI制御:CMAKE_ANDROID_RTTI徹底解説


CMAKE_ANDROID_RTTI は、CMake で Android 用にクロスコンパイルする場合に、ランタイム型情報 (RTTI) の使用を制御するために使用される変数です。

バージョン

この変数は CMake 3.20 以降で導入されました。

用途

RTTI は、C++ プログラムで動的に型情報を取得するために使用される機能です。これは、デバッグやシリアル化などのタスクに役立ちます。

しかし、RTTI はパフォーマンスオーバーヘッドを伴うため、パフォーマンスが重要な Android アプリケーションでは無効にすることが好ましい場合があります。

設定方法

CMAKE_ANDROID_RTTI は、以下のいずれかの方法で設定できます。

  • CMakeLists.txt ファイルで直接設定する:
set(CMAKE_ANDROID_RTTI ON)
  • コマンドラインオプションで設定する:
cmake -DCMAKE_ANDROID_RTTI=ON .

デフォルト値

デフォルトでは、CMAKE_ANDROID_RTTION に設定されています。

関連変数

以下の変数も CMAKE_ANDROID_RTTI と関連しています。

  • CMAKE_ANDROID_EXCEPTIONS: C++ 例外の使用を制御します。この変数の値が ON の場合、CMAKE_ANDROID_RTTI も自動的に ON に設定されます。
  • CMAKE_ANDROID_STL_TYPE: 使用する C++ 標準ライブラリの種類を指定します。この変数の値が c++_static または c++_shared の場合、CMAKE_ANDROID_RTTI は自動的に ON に設定されます。

注意事項

  • RTTI の使用を無効にすることで、パフォーマンスが向上する可能性がありますが、デバッグやシリアル化などのタスクがより困難になる場合があります。
  • CMAKE_ANDROID_RTTIOFF に設定すると、RTTI を使用するコードはコンパイルエラーになります。

以下の例は、CMAKE_ANDROID_RTTIOFF に設定し、c++_static C++ 標準ライブラリを使用する CMakeLists.txt ファイルを示しています。

cmake_minimum_required(VERSION 3.20)

project(MyProject)

set(CMAKE_TOOLCHAIN_FILE path/to/android-ndk/build/cmake/android.toolchain.cmake)

set(CMAKE_ANDROID_NDK path/to/android-ndk)
set(CMAKE_ANDROID_STL_TYPE c++_static)
set(CMAKE_ANDROID_RTTI OFF)

add_executable(MyProgram main.cpp)


例 1: RTTI を有効にする

cmake_minimum_required(VERSION 3.20)

project(MyProject)

set(CMAKE_TOOLCHAIN_FILE path/to/android-ndk/build/cmake/android.toolchain.cmake)

set(CMAKE_ANDROID_NDK path/to/android-ndk)

add_executable(MyProgram main.cpp)

この例では、MyProgram という名前の実行可能ファイルが生成されます。この実行可能ファイルは、RTTI を使用してコンパイルされます。

例 2: RTTI を無効にする

cmake_minimum_required(VERSION 3.20)

project(MyProject)

set(CMAKE_TOOLCHAIN_FILE path/to/android-ndk/build/cmake/android.toolchain.cmake)

set(CMAKE_ANDROID_NDK path/to/android-ndk)
set(CMAKE_ANDROID_RTTI OFF)

add_executable(MyProgram main.cpp)

例 3: c++_static C++ 標準ライブラリを使用し、RTTI を無効にする

cmake_minimum_required(VERSION 3.20)

project(MyProject)

set(CMAKE_TOOLCHAIN_FILE path/to/android-ndk/build/cmake/android.toolchain.cmake)

set(CMAKE_ANDROID_NDK path/to/android-ndk)
set(CMAKE_ANDROID_STL_TYPE c++_static)
set(CMAKE_ANDROID_RTTI OFF)

add_executable(MyProgram main.cpp)

この例では、MyProgram という名前の実行可能ファイルが生成されます。この実行可能ファイルは、c++_static C++ 標準ライブラリを使用して、RTTI を使用せずにコンパイルされます。

これらの例は、CMAKE_ANDROID_RTTI をさまざまな方法で設定する方法を示すほんの一例です。具体的な設定は、プロジェクトのニーズによって異なります。

  • Android NDK のパスは、システムにインストールされている場所に応じて異なる場合があります。
  • CMakeLists.txt ファイルのパスは、プロジェクトの構成によって異なる場合があります。
  • 上記の例では、main.cpp という名前のソースファイルが存在することを前提としています。このファイルには、RTTI を使用するコードが含まれている必要があります。


以下に、CMAKE_ANDROID_RTTI の代替方法をいくつか紹介します。

CMAKE_CXX_FLAGS を使用する

CMAKE_ANDROID_RTTI を無効にする代わりに、CMAKE_CXX_FLAGS を使用して -fno-rtti フラグをコンパイラに渡すことができます。

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti")

target_link_libraries を使用する

RTTI を使用しない C++ 標準ライブラリにリンクすることで、RTTI を無効にすることができます。

target_link_libraries(MyProgram c++_static)

この方法は、c++_static C++ 標準ライブラリを使用する場合にのみ有効です。

コードを変更する

RTTI を使用するコードを、RTTI を使用しないコードに変更することもできます。

これは、最も трудоемкий 方法ですが、パフォーマンスを最大限に高める場合は最善の方法となる場合があります。

コンパイラオプションを使用する

一部のコンパイラは、RTTI を無効にするためのオプションを提供しています。

これらのオプションの詳細については、コンパイラのドキュメントを参照してください。

最適な方法を選択

最適な方法は、プロジェクトのニーズによって異なります。

パフォーマンスが重要な場合は、CMAKE_CXX_FLAGS を使用して -fno-rtti フラグをコンパイラに渡すか、RTTI を使用しない C++ 標準ライブラリにリンクすることをお勧めします。

柔軟性が必要な場合は、CMAKE_CXX_FLAGS を使用する方がよいでしょう。

コードを変更する場合は、その影響を慎重に評価する必要があります。

  • 上記の方法は、CMake 3.20 以降で使用できます。