linux C++ 应用程序打包发布

linux c++ 动态库打包 应用程序打包 动态库搜索路径

1. 问题

linux环境下打包C++应用程序,包括其依赖的动态库,以便解决程序发布后程序运行动态库缺失问题

2. 解决

  1. 动态库编译时添加-fPIC编译选项(一般动态库都会有此选项,自己写的库记得添加)

    -fPIC: 生成与位置无关代码

  2. 编译自己的应用程序,得到test

  3. 打包动态库:使用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;

posted @ 2020-03-15 20:47  段长大人王大厨  阅读(2806)  评论(0编辑  收藏  举报