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;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM