CMake技术问询:如何仅安装find_library找到的共享库?
只安装共享库的CMake解决方案
这个场景我之前处理过,完全不用创建虚拟目标,也不用调整你现有的分类逻辑——核心就是对find_library拿到的库列表做后缀过滤,只保留共享库文件再执行安装。
具体实现步骤
先根据平台定义共享库的匹配规则
不同系统的共享库后缀不一样,先写个平台判断:# 定义各平台共享库的正则匹配模式 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()遍历现有库列表,筛选出共享库
假设你已经通过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()安装筛选后的共享库
最后用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
相关产品推荐
相关产品推荐

