【決定版】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 以降でのみ使用できます。