You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 14:30:26