构建非静态目标时,如何让CMake使用依赖库的静态版本?
在CMake中混合动态/静态链接依赖库
针对你的需求——大部分依赖采用动态链接,仅指定库(如libtiff)链接静态版本,CMake提供多种实现方式,无需手动创建两个目标:
方法1:临时调整库查找优先级
在调用find_package()查找目标库前,临时修改CMAKE_FIND_LIBRARY_SUFFIXES,让CMake优先查找静态库后缀,查找完成后恢复原有设置,不影响其他库的查找逻辑:
# 保存原有库后缀配置 set(ORIGINAL_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) # 根据系统设置静态库优先的后缀 if(WIN32) set(CMAKE_FIND_LIBRARY_SUFFIXES .lib .dll.a .dll) else() set(CMAKE_FIND_LIBRARY_SUFFIXES .a .so) endif() # 查找目标库,此时会优先选择静态版本 find_package(LibTIFF REQUIRED) # 恢复原有后缀配置 set(CMAKE_FIND_LIBRARY_SUFFIXES ${ORIGINAL_SUFFIXES}) # 链接到你的可执行文件 target_link_libraries(your_executable PRIVATE TIFF::TIFF)
方法2:直接使用静态库目标
部分库的CMake配置会同时生成动态和静态目标,比如libtiff可能提供TIFF::TIFF-static这类静态目标(具体名称可查看库的CMake配置文件)。直接链接该目标即可:
find_package(LibTIFF REQUIRED) target_link_libraries(your_executable PRIVATE TIFF::TIFF-static)
如果不确定目标名称,可以通过get_cmake_property(_all_targets TARGETS)命令列出当前所有CMake目标,从中筛选相关项。
方法3:手动创建静态导入目标(兜底方案)
如果前两种方法无法生效,可手动定位静态库文件并创建导入目标:
# 手动查找静态库文件 find_library(LIBTIFF_STATIC NAMES tiff libtiff.a PATHS /path/to/libtiff/lib # 替换为实际库路径 ) # 创建静态导入目标 add_library(LibTIFF::Static IMPORTED STATIC) set_target_properties(LibTIFF::Static PROPERTIES IMPORTED_LOCATION ${LIBTIFF_STATIC} INTERFACE_INCLUDE_DIRECTORIES /path/to/libtiff/include # 替换为实际头文件路径 ) # 链接到可执行文件 target_link_libraries(your_executable PRIVATE LibTIFF::Static)
内容的提问来源于stack exchange,提问作者einpoklum
相关产品推荐
相关产品推荐

