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

CMake技术问询:如何仅安装find_library找到的共享库?

只安装共享库的CMake解决方案

这个场景我之前处理过,完全不用创建虚拟目标,也不用调整你现有的分类逻辑——核心就是对find_library拿到的库列表做后缀过滤,只保留共享库文件再执行安装。

具体实现步骤

  1. 先根据平台定义共享库的匹配规则
    不同系统的共享库后缀不一样,先写个平台判断:

    # 定义各平台共享库的正则匹配模式
    if(UNIX AND NOT APPLE)
        # Linux下匹配.so及版本化的.so.x.y.z
        set(SHARED_LIB_PATTERN ".*\\.so(\\..*)?$")
    elseif(APPLE)
        # macOS下匹配.dylib及版本化的.dylib.x.y.z
        set(SHARED_LIB_PATTERN ".*\\.dylib(\\..*)?$")
    elseif(WIN32)
        # Windows下匹配.dll(注意:find_library默认找.lib导入库,若要找.dll需用find_file)
        set(SHARED_LIB_PATTERN ".*\\.dll$")
    endif()
    
  2. 遍历现有库列表,筛选出共享库
    假设你已经通过find_library得到了库列表(比如变量MY_LIBRARIES),循环遍历每个库文件,用正则匹配筛选:

    set(SHARED_LIBRARIES_TO_INSTALL "")
    foreach(LIB_FILE ${MY_LIBRARIES})
        # 检查当前库文件是否符合共享库模式
        if(LIB_FILE MATCHES ${SHARED_LIB_PATTERN})
            list(APPEND SHARED_LIBRARIES_TO_INSTALL ${LIB_FILE})
        endif()
    endforeach()
    
  3. 安装筛选后的共享库
    最后用install(FILES)安装过滤后的列表就行,完全兼容你现有的分类逻辑:

    # 安装到系统默认库目录,或者替换成你自己的目录
    install(FILES ${SHARED_LIBRARIES_TO_INSTALL} 
            DESTINATION ${CMAKE_INSTALL_LIBDIR})
    

适配你现有分类的扩展用法

如果你已经按业务/功能把库分成了不同分组(比如LIB_GROUP_A、LIB_GROUP_B),可以对每个分组单独过滤,不打乱原有分类:

foreach(GROUP_NAME LIB_GROUP_A LIB_GROUP_B)
    set(SHARED_GROUP_LIBS "")
    foreach(LIB_FILE ${${GROUP_NAME}})
        if(LIB_FILE MATCHES ${SHARED_LIB_PATTERN})
            list(APPEND SHARED_GROUP_LIBS ${LIB_FILE})
        endif()
    endforeach()
    # 按原有分类路径安装,比如每个分组单独放子目录
    install(FILES ${SHARED_GROUP_LIBS} 
            DESTINATION ${CMAKE_INSTALL_LIBDIR}/${GROUP_NAME})
endforeach()

补充说明

  • Linux下的符号链接(比如libfoo.so -> libfoo.so.1)也会被正则匹配到,安装时会自动处理符号链接关系
  • Windows下如果需要安装.dll,注意find_library默认查找的是.lib导入库,这时候需要用find_file单独查找.dll文件,再加入到过滤列表里

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:21:43