【決定版】Android向けSTLの選び方:"ANDROID_STL_TYPE"と代替方法を比較
"ANDROID_STL_TYPE" は、CMake の "Properties: Targets" におけるターゲット プロパティであり、Android 向けのクロスコンパイル時に使用する C++ 標準ライブラリ (STL) の種類を指定します。このプロパティは、NVIDIA Nsight Tegra Visual Studio Edition または NDK を用いてビルドする場合にのみ使用できます。
値
"ANDROID_STL_TYPE" には、以下のいずれかの値を設定できます。
- c++_shared
標準の C++ コンパイラ付属の共有ライブラリを使用します。 - c++_static
標準の C++ コンパイラ付属の静的ライブラリを使用します。 - stlport_shared
STLport の共有ライブラリを使用します。 - stlport_static
STLport の静的ライブラリを使用します。 - gnulibc_shared
GNU libc の共有ライブラリを使用します。 - gnulibc_static
GNU libc の静的ライブラリを使用します。これがデフォルト値です。
選択ガイド
適切な "ANDROID_STL_TYPE" の値を選択するには、以下の要素を考慮する必要があります。
- パフォーマンス
静的ライブラリは共有ライブラリよりも高速ですが、コードサイズが大きくなります。 - ビルド ツール
NDK または NVIDIA Nsight Tegra Visual Studio Edition を使用しているかによって、利用可能な STL オプションが異なります。 - ターゲット プラットフォーム
使用する Android デバイスのアーキテクチャ (ARM、x86 など) によって、利用可能な STL オプションが異なります。
例
以下の例は、GNU libc の静的ライブラリを使用してターゲット "mytarget" をビルドする方法を示しています。
set_target_properties(mytarget PROPERTIES ANDROID_STL_TYPE gnulibc_static)
- CMake の "find_package()" コマンドを使用して、特定の STL オプションの可用性をチェックできます。
- "ANDROID_STL_TYPE" は、ターゲット プロパティであるため、ターゲットごとに個別に設定する必要があります。
例 1: GNU libc の静的ライブラリを使用してターゲットをビルドする
cmake_minimum_required(VERSION 3.4)
project(myproject)
set(SOURCE_FILES main.cpp)
set(TARGET_LINK_LIBRARIES android)
add_executable(mytarget ${SOURCE_FILES})
set_target_properties(mytarget PROPERTIES ANDROID_STL_TYPE gnulibc_static)
例 2: NDK を使用して STLport の共有ライブラリを使用してターゲットをビルドする
cmake_minimum_required(VERSION 3.4)
project(myproject)
set(SOURCE_FILES main.cpp)
find_package(NDK REQUIRED)
add_executable(mytarget ${SOURCE_FILES})
set_target_properties(mytarget PROPERTIES ANDROID_STL_TYPE stlport_shared)
target_link_libraries(mytarget ${NDK_STLPORT_SHARED_LIBRARIES})
例 3: NVIDIA Nsight Tegra Visual Studio Edition を使用して c++_static ライブラリを使用してターゲットをビルドする
cmake_minimum_required(VERSION 3.4)
project(myproject)
set(SOURCE_FILES main.cpp)
set(CMAKE_ANDROID_STL_TYPE c++_static)
add_executable(mytarget ${SOURCE_FILES})
- 実際のプロジェクトでは、ターゲット プラットフォーム、ビルド ツール、パフォーマンス要件、および依存関係に基づいて適切な "ANDROID_STL_TYPE" の値を選択する必要があります。
- 各例では、適切な STL ライブラリをリンクするために必要なコマンドも示されています。
- 上記の例では、3 つの異なる "ANDROID_STL_TYPE" の値を使用してターゲットをビルドしています。
代替方法
"ANDROID_STL_TYPE" の代替方法として、以下の方法が考えられます。
- NDK_TOOLCHAIN_VARIABLES を使用する
NDK_TOOLCHAIN_VARIABLES を使用すると、NDK によって提供される STL ライブラリの場所を直接指定できます。これは、特定のバージョンの STL を使用したい場合や、カスタム ビルドの STL を使用したい場合に役立ちます。
set(NDK_TOOLCHAIN_VARIABLES "${NDK}/build/core/toolchains/llvm/lib64/armeabi-v7a/lib:$<STAGING_DIR>/lib")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${NDK_TOOLCHAIN_VARIABLES}")
- ターゲットの CXXFLAGS または LINKFLAGS を設定する
ターゲットの CXXFLAGS または LINKFLAGS を設定すると、コンパイラまたはリンカーに STL ライブラリの場所を指定できます。これは、NDK 以外のビルド ツールを使用している場合に役立ちます。
set_target_properties(mytarget PROPERTIES CXXFLAGS "-L/path/to/stl/lib")
set_target_properties(mytarget PROPERTIES LINKFLAGS "-L/path/to/stl/lib")
- find_package() コマンドを使用する
find_package() コマンドを使用すると、特定の STL ライブラリパッケージを検索して、必要なライブラリとヘッダーファイルへのパスを自動的に設定できます。
find_package(STLPORT REQUIRED)
target_link_libraries(mytarget ${STLPORT_LIBRARIES})
- 使用する代替方法は、プロジェクトの要件と使用しているビルド ツールによって異なります。
- 上記の代替方法は、"ANDROID_STL_TYPE" を使用する場合よりも複雑になる場合があります。
- NDK 18 以降では、"ANDROID_STL_TYPE" は非推奨になっています。
- "ANDROID_STL_TYPE" は、CMake 3.4 以降でのみ使用できます。