linux C++ 应用程序打包发布
linux
c++
动态库打包
应用程序打包
动态库搜索路径
1. 问题
linux环境下打包C++应用程序,包括其依赖的动态库,以便解决程序发布后程序运行动态库缺失问题
2. 解决
-
动态库编译时添加
-fPIC
编译选项(一般动态库都会有此选项,自己写的库记得添加)-fPIC
: 生成与位置无关代码 -
编译自己的应用程序,得到
test
-
打包动态库:使用
pack_lib.sh
脚本将test
依赖的动态库至某文件夹(如可在发布的程序根目录下新建lib文件夹,如下所示)
.
bin/test
lib/
#! /bin/sh
# pack_lib.sh
deplist=$( ldd $1 | awk '{if (match($3,"/")){ print $3}}' )
cp -L -n $deplist $2
使用方式:
sudo chmod a+x pack_lib.sh # 增加执行权限
./pack_lib.sh test ./lib/ # 第一个参数: 应用程序 第二个参数: lib/路径
4.创建发布后应用程序执行脚本:作用是将工程目录下的lib/路径添加到动态库搜索路径中。当程序发布后,应当通过该脚本启动应用程序。
#! /bin/bash
# AppRun.sh
SHELL_FOLDER=$(cd "$(dirname "$0")";pwd)
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${SHELL_FOLDER}/lib
${SHELL_FOLDER}/test "$@"
使用方式:
./AppRun.sh
# 如果test需要添加参数 如下
./AppRun.sh param1 param2
3. 扩展
运行时动态库的搜索路径的先后顺序:
1.编译目标代码时指定的动态库搜索路径;
2.环境变量LD_LIBRARY_PATH
指定的动态库搜索路径;
3.配置文件/etc/ld.so.conf中指定的动态库搜索路径;
4.默认的动态库搜索路径/lib和/usr/lib;