CMake find_library可找到静态库无法找到共享库问题排查咨询
问题产生原因
find_library是CMake设计用于查找链接阶段所需库文件的专用命令。Windows平台下动态库(.dll)本身不参与链接流程,参与链接的是动态库对应的导入库(.lib),因此find_library默认逻辑不会将.dll识别为合法的库文件目标。- 即使你手动拼接了
b${CMAKE_SHARED_LIBRARY_SUFFIX}即b.dll作为搜索名称,find_library默认仍会自动为目标名追加CMAKE_FIND_LIBRARY_SUFFIXES中定义的后缀(Windows下默认值为.lib),实际搜索的文件名为b.dll.lib,自然无法匹配到目录下的b.dll。
解决方案
根据你的使用场景选择对应方案:
场景1:查找动态库的导入库用于链接
直接按照静态库的查找逻辑编写即可,不需要添加.dll后缀,CMake会自动匹配到对应的导入库:
find_library(b b PATHS "c:/work/libs/debug")
场景2:查找.dll文件用于部署到运行目录
.dll属于运行时文件,应该使用通用文件查找命令find_file:
find_file(b_dll NAMES b${CMAKE_SHARED_LIBRARY_SUFFIX} PATHS "c:/work/libs/debug")
如果需要沿用find_library的多目录查找逻辑,可以临时修改搜索后缀列表:
# 备份原有搜索后缀 set(ORIGIN_FIND_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) # 加入动态库后缀到搜索列表 list(APPEND CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_SHARED_LIBRARY_SUFFIX}) find_library(b b PATHS "c:/work/libs/debug") # 恢复原有配置避免影响后续逻辑 set(CMAKE_FIND_LIBRARY_SUFFIXES ${ORIGIN_FIND_SUFFIXES})
内容的提问来源于stack exchange,提问作者def
相关产品推荐
相关产品推荐

