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

构建非静态目标时,如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 22:30:34