CMake组件间依赖时合规使用CPACK_DEBIAN_PACKAGE_SHLIBDEPS的方法
针对你遇到的dpkg-shlibdeps无法识别lib组件库的问题,以下是几种更符合Debian打包规范的解决方案:
使用组件级SHLIBDEPS路径配置
CMake针对Debian组件打包提供了组件专属的路径配置变量CPACK_DEBIAN_<COMPONENT>_PACKAGE_SHLIBDEPS_LIBRARY_DIRS,可以精准指定对应组件打包时dpkg-shlibdeps的库搜索路径。针对你的场景,只需为bin组件添加:set(CPACK_DEBIAN_BIN_PACKAGE_SHLIBDEPS_LIBRARY_DIRS "${CMAKE_CURRENT_BINARY_DIR}/lib/${CMAKE_INSTALL_LIBDIR}")这里的路径指向lib组件在构建树中的安装目录,dpkg-shlibdeps处理bin组件时会自动扫描该目录,无需全局设置RPATH或冗余的
CPACK_DEBIAN_PACKAGE_SHLIBDEPS_PRIVATE_DIRS。遵循Debian标准文件布局
确保lib组件的库安装到Debian标准系统库路径(如/usr/lib或/usr/lib/${CMAKE_HOST_SYSTEM_PROCESSOR}),而非自定义路径。在CMake中配置:set(CMAKE_INSTALL_LIBDIR "lib/${CMAKE_HOST_SYSTEM_PROCESSOR}" CACHE PATH "Library installation directory")标准路径下的库会被dpkg-shlibdeps自动识别,完全符合Debian打包指南对文件布局的要求。
通过CPACK钩子脚本临时更新库缓存
若因需求必须使用非标准路径,可在打包bin组件前,通过CPACK预打包脚本调用ldconfig临时识别lib组件的库目录。创建脚本pre_bin_pack.sh:#!/bin/bash ldconfig -n "${CPACK_INSTALL_PREFIX}/lib/${CMAKE_INSTALL_LIBDIR}"然后在CMake中关联该脚本:
set(CPACK_DEBIAN_BIN_PACKAGE_PRE_INSTALL_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/pre_bin_pack.sh")脚本会在bin组件打包前执行,让系统库缓存识别到lib组件的库,确保dpkg-shlibdeps正常解析依赖。
内容的提问来源于stack exchange,提问作者Pait

