是否存在用于识别C++标准库实现的CMake变量?
识别CMake构建中的C++标准库实现
CMake没有官方内置的直接变量用于识别当前使用的C++标准库实现,但可以通过编译检测的方式手动实现这一需求,完全满足你在配置阶段打印信息、排查标准库混合导致的符号问题。
以下是一套实用的检测方案,可识别常见的标准库(libstdc++、libc++、MSVC标准库、STLPort):
核心检测思路
利用不同标准库特有的预定义宏,通过CMake的try_compile命令在配置阶段编译测试代码,判断当前环境使用的标准库类型。
实现代码
在CMakeLists.txt中添加以下代码:
# 初始化自定义变量存储标准库信息 set(CXX_STDLIB "Unknown") # 检测MSVC标准库 if(MSVC) set(CXX_STDLIB "MSVC++ Standard Library") else() # 检测libc++(LLVM) try_compile( CXX_USING_LIBCXX ${CMAKE_BINARY_DIR}/cxx_stdlib_test ${CMAKE_CURRENT_LIST_DIR}/cxx_stdlib_test.cpp COMPILE_DEFINITIONS "-stdlib=libc++" OUTPUT_VARIABLE _cxx_stdlib_output ) if(CXX_USING_LIBCXX) set(CXX_STDLIB "libc++ (LLVM)") else() # 检测libstdc++(GCC) try_compile( CXX_USING_LIBSTDCXX ${CMAKE_BINARY_DIR}/cxx_stdlib_test ${CMAKE_CURRENT_LIST_DIR}/cxx_stdlib_test.cpp COMPILE_DEFINITIONS "-stdlib=libstdc++" OUTPUT_VARIABLE _cxx_stdlib_output ) if(CXX_USING_LIBSTDCXX) set(CXX_STDLIB "libstdc++ (GCC)") else() # 检测STLPort try_compile( CXX_USING_STLPORT ${CMAKE_BINARY_DIR}/cxx_stdlib_test ${CMAKE_CURRENT_LIST_DIR}/cxx_stdlib_test.cpp COMPILE_DEFINITIONS "-D__STL_PORT_VERSION" OUTPUT_VARIABLE _cxx_stdlib_output ) if(CXX_USING_STLPORT) set(CXX_STDLIB "STLPort") endif() endif() endif() endif() # 配置阶段打印标准库信息 message(STATUS "Current C++ Standard Library: ${CXX_STDLIB}")
对应的测试文件cxx_stdlib_test.cpp内容:
#ifdef _LIBCPP_VERSION int main() { return 0; } #elif defined(__GLIBCXX__) int main() { return 0; } #elif defined(__STL_PORT_VERSION) int main() { return 0; } #endif
补充说明
- 对于Clang环境,如果手动指定了
-stdlib=libc++或-stdlib=libstdc++,上述检测会自动匹配对应的标准库; - GCC默认使用libstdc++,无需额外指定编译选项即可被检测到;
- MSVC环境下直接判定为微软自家的标准库,无需编译检测;
- 若需要支持更多小众标准库,可扩展测试文件中的预定义宏判断逻辑。
内容的提问来源于stack exchange,提问作者Phil Miller
相关产品推荐
相关产品推荐

