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
相关产品推荐
相关产品推荐

