在使用CMake构建Android项目时,可以使用参数"-DANDROID_STL=none"来指定不使用任何STL(标准模板库)。这个参数告诉CMake不要链接任何STL库,这样就可以避免在Android NDK构建过程中使用STL。
通常情况下,Android NDK支持多种STL,包括默认的C++运行时库(gnustl)、LLVM的libc++以及STLport。但是有些情况下,我们可能希望不使用任何STL,比如当我们要使用自定义的STL实现或者完全避免STL时。
使用参数"-DANDROID_STL=none"可以达到这个目的,不会链接任何STL库,需要注意的是,这也意味着在代码中使用STL相关的功能会导致链接错误,因此在使用该参数的同时需要谨慎处理STL相关的代码。
在CMakeLists.txt中,您可以这样使用这个参数:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -frtti -fexceptions")
# 在添加目标时使用参数
add_library(your_target_name SHARED src1.cpp src2.cpp)
target_compile_options(your_target_name PRIVATE -DANDROID_STL=none)
externalNativeBuild {
cmake {
arguments "-DANDROID_STL=none"
}
}
-Wl,--exclude-libs,libc++_static.a
和 -Wl,--exclude-libs,libc++abi.a
是链接选项,它们的作用是告诉链接器在链接过程中排除特定的静态库文件,这里分别排除了 libc++_static.a
和 libc++abi.a
。
if (${ANDROID_STL} STREQUAL "c++_static")
target_link_options(${PROJECT_NAME} PRIVATE
"-Wl,--exclude-libs,libc++_static.a"
"-Wl,--exclude-libs,libc++abi.a")
endif ()
if (${ANDROID_STL} STREQUAL "c++_static")
string(APPEND CMAKE_SHARED_LINKER_FLAGS " -Wl,--exclude-libs,libc++_static.a")
string(APPEND CMAKE_SHARED_LINKER_FLAGS " -Wl,--exclude-libs,libc++abi.a")
endif()