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

Windows下CMake如何获取共享库的.lib文件名而非.dll?

获取Windows共享库的导入LIB文件(CMake)

在Windows下用CMake生成共享库时,确实$<TARGET_FILE:mylibname>会返回DLL文件路径——因为这个生成器表达式指向的是运行时可执行文件,而共享库的导入LIB是链接阶段用的文件,得用专门的生成器表达式来获取:

直接解决方案:用$<TARGET_LINKER_FILE:mylibname>

这个生成器表达式专门用来获取目标的链接器输入文件,在Windows下对于SHARED库来说,它会返回对应的.LIB导入库路径;在其他平台(比如Linux)则会返回.so文件,完美适配跨场景需求。

举个实际使用的例子,比如你原本的add_custom_command是这样的:

add_custom_command(
  TARGET myexe POST_BUILD
  COMMAND my_tool.exe --dll $<TARGET_FILE:mylibname>
)

现在要替换成获取LIB文件的版本:

add_custom_command(
  TARGET myexe POST_BUILD
  COMMAND my_tool.exe --lib $<TARGET_LINKER_FILE:mylibname>
  COMMENT "Processing the import library for mylibname"
)

备选方案:用get_target_property(不推荐,不如生成器表达式灵活)

如果你需要把路径存到变量里,可以用get_target_property配合目标属性LINKER_FILE(带配置后缀的版本比如LINKER_FILE_DEBUG/LINKER_FILE_RELEASE):

# 获取Debug配置下的LIB路径
get_target_property(MYLIB_LIB_DEBUG mylibname LINKER_FILE_DEBUG)
# 获取Release配置下的LIB路径
get_target_property(MYLIB_LIB_RELEASE mylibname LINKER_FILE_RELEASE)

# 然后在自定义命令中使用
add_custom_command(
  TARGET myexe POST_BUILD
  COMMAND my_tool.exe --lib $<IF:$<CONFIG:Debug>,${MYLIB_LIB_DEBUG},${MYLIB_LIB_RELEASE}>
)

不过这种方式需要手动处理不同构建配置,远不如$<TARGET_LINKER_FILE>来得简洁自动,所以优先推荐前者。

简单解释下背后的逻辑:CMake中TARGET_FILE对应的是目标的LOCATION属性,对于Windows的SHARED库,这个属性指向的是运行时的DLL文件,而导入LIB是单独生成的链接器依赖文件,所以需要用专门的LINKER_FILE相关的生成器表达式/属性来获取。

内容的提问来源于stack exchange,提问作者CDZ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:33:14