CMake如何检测当前选中的链接器?
在CMake中检测当前使用的链接器
CMake本身没有提供CMAKE_LINKER_ID这类内置变量,但可以通过以下几种方式手动检测当前链接器:
方法1:通过编译器驱动获取链接器信息
多数场景下链接器是通过GCC、Clang等编译器间接调用的,可让编译器输出链接器版本信息并解析判断:
# 获取链接器版本输出 execute_process( COMMAND ${CMAKE_CXX_COMPILER} -fuse-ld=none -Wl,--version ERROR_VARIABLE LINKER_VERSION_OUTPUT OUTPUT_QUIET RESULT_VARIABLE LINKER_CHECK_RESULT ) # 匹配并设置链接器ID if("${LINKER_VERSION_OUTPUT}" MATCHES "GNU ld") set(LINKER_ID "ld") elseif("${LINKER_VERSION_OUTPUT}" MATCHES "GNU gold") set(LINKER_ID "gold") elseif("${LINKER_VERSION_OUTPUT}" MATCHES "LLD") set(LINKER_ID "lld") elseif("${LINKER_VERSION_OUTPUT}" MATCHES "mold") set(LINKER_ID "mold") else() set(LINKER_ID "unknown") endif() # 输出检测结果 message(STATUS "Detected linker: ${LINKER_ID}")
方法2:直接检查指定的链接器可执行文件
若已通过CMAKE_LINKER变量明确指定链接器路径,可直接调用其版本命令判断:
if(DEFINED CMAKE_LINKER) execute_process( COMMAND ${CMAKE_LINKER} --version OUTPUT_VARIABLE LINKER_VERSION_OUTPUT RESULT_VARIABLE LINKER_CHECK_RESULT ) if("${LINKER_VERSION_OUTPUT}" MATCHES "GNU ld") set(LINKER_ID "ld") elseif("${LINKER_VERSION_OUTPUT}" MATCHES "GNU gold") set(LINKER_ID "gold") elseif("${LINKER_VERSION_OUTPUT}" MATCHES "LLD") set(LINKER_ID "lld") elseif("${LINKER_VERSION_OUTPUT}" MATCHES "mold") set(LINKER_ID "mold") else() set(LINKER_ID "unknown") endif() message(STATUS "Detected linker: ${LINKER_ID}") endif()
方法3:解析CMake的链接命令模板
CMAKE_CXX_LINK_EXECUTABLE变量存储了CMake链接可执行文件的命令模板,可从中提取链接器标识:
string(REGEX MATCH "ld|gold|lld|mold" LINKER_ID "${CMAKE_CXX_LINK_EXECUTABLE}") if(LINKER_ID) message(STATUS "Detected linker: ${LINKER_ID}") else() message(STATUS "Linker detection failed: unknown linker") endif()
注意事项
- 不同平台、编译器的版本输出格式可能略有差异,需根据实际情况调整正则匹配规则。
- 若通过
-fuse-ld=参数指定链接器,需确保该参数在CMake配置阶段已生效,否则检测结果可能不准确。
内容的提问来源于stack exchange,提问作者David Ledger
相关产品推荐
相关产品推荐

