如何用Conan将项目生成的libtask-manager.so安装到系统标准库目录?
解决方案
一、本地构建后将库安装到系统目录
要让libtask-manager.so安装到/lib/x86_64-linux-gnu,需先在子项目的CMake配置中添加安装规则,再执行安装命令:
修改子项目CMakeLists.txt
打开business/task-manager/CMakeLists.txt,添加以下安装规则:# 安装libtask-manager.so到系统库目录 install(TARGETS task-manager LIBRARY DESTINATION /lib/x86_64-linux-gnu COMPONENT runtime)执行构建与安装
完成构建后,通过CMake的install目标完成安装(需root权限):# 先执行构建 cmake --build . --preset conan-release # 执行安装,sudo是因为写入系统目录需要权限 sudo cmake --build . --preset conan-release --target install
二、Docker多阶段构建适配
针对Docker镜像中缺失库的问题,可在构建阶段完成库的安装,再复制到运行镜像中:
# 第一阶段:构建项目与安装库 FROM gcc:12 AS builder WORKDIR /app # 复制项目源码 COPY . . # 安装Conan并配置依赖 RUN pip install conan RUN conan install . --preset conan-release --build=missing # 构建项目 RUN cmake --build . --preset conan-release # 将库安装到构建容器的系统目录 RUN cmake --install . --preset conan-release --component runtime # 第二阶段:运行镜像 FROM debian:bookworm-slim # 复制可执行文件 COPY --from=builder /app/build/conan-release/CPPTemplate /usr/local/bin/ # 复制已安装的库到运行镜像的系统目录 COPY --from=builder /lib/x86_64-linux-gnu/libtask-manager.so /lib/x86_64-linux-gnu/ # 启动应用 CMD ["/usr/local/bin/CPPTemplate"]
补充说明
- 如果不想安装到系统目录,也可以在构建后将
libtask-manager.so复制到可执行文件同目录,运行时通过LD_LIBRARY_PATH指定,但安装到系统目录是最通用的解决方式。 - Docker构建阶段中无需
sudo,因为容器默认以root用户运行。
内容的提问来源于stack exchange,提问作者Marc Le Bihan
相关产品推荐
相关产品推荐

