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;