linux C++打包程序总结
linux C++打包程序總結(jié)
linux c++ 動(dòng)態(tài)庫(kù)打包 應(yīng)用程序打包 動(dòng)態(tài)庫(kù)搜索路徑
- 問(wèn)題
linux環(huán)境下打包C++應(yīng)用程序,包括依賴的動(dòng)態(tài)庫(kù),以便解決程序發(fā)布后程序運(yùn)行動(dòng)態(tài)庫(kù)缺失問(wèn)題 - 解決
? 動(dòng)態(tài)庫(kù)編譯時(shí)添加-fPIC編譯選項(xiàng)(一般動(dòng)態(tài)庫(kù)都會(huì)有此選項(xiàng),自己寫(xiě)的庫(kù)記得添加)
? -fPIC: 生成與位置無(wú)關(guān)代碼
? 編譯自己的應(yīng)用程序,得到test
? 打包動(dòng)態(tài)庫(kù):使用pack_lib.sh腳本將test依賴的動(dòng)態(tài)庫(kù)至某文件夾(如可在發(fā)布的程序根目錄下新建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 # 增加執(zhí)行權(quán)限
./pack_lib.sh test ./lib/ # 第一個(gè)參數(shù): 應(yīng)用程序 第二個(gè)參數(shù): lib/路徑
4.創(chuàng)建發(fā)布后應(yīng)用程序執(zhí)行腳本:作用是將工程目錄下的lib/路徑添加到動(dòng)態(tài)庫(kù)搜索路徑中。當(dāng)程序發(fā)布后,應(yīng)當(dāng)通過(guò)該腳本啟動(dòng)應(yīng)用程序。
#! /bin/bash
AppRun.sh
SHELL_FOLDER=(cd"(cd "(cd"(dirname “0")";pwd)exportLDLIBRARYPATH=0")";pwd) export LD_LIBRARY_PATH=0")";pwd)exportLDL?IBRARYP?ATH={LD_LIBRARY_PATH}😒{SHELL_FOLDER}/lib
SHELLFOLDER/test"{SHELL_FOLDER}/test "SHELLF?OLDER/test"@”
使用方式:
./AppRun.sh
如果test需要添加參數(shù) 如下
./AppRun.sh param1 param2
3. 擴(kuò)展
運(yùn)行時(shí)動(dòng)態(tài)庫(kù)的搜索路徑的先后順序:
1.編譯目標(biāo)代碼時(shí)指定的動(dòng)態(tài)庫(kù)搜索路徑;
2.環(huán)境變量LD_LIBRARY_PATH指定的動(dòng)態(tài)庫(kù)搜索路徑;
3.配置文件/etc/ld.so.conf中指定的動(dòng)態(tài)庫(kù)搜索路徑;
4.默認(rèn)的動(dòng)態(tài)庫(kù)搜索路徑/lib和/usr/lib;
C/C++編程:Linux下打包發(fā)布Qt應(yīng)用程序
Linux下使用Qt進(jìn)行開(kāi)發(fā)的程序,如果想要在其它搭載Linux系統(tǒng)的主機(jī)上運(yùn)行,需要將要發(fā)布的Qt程序依賴的一些動(dòng)態(tài)鏈接庫(kù)一起打包。具體做法如下:
1、編譯文件
在Qt中使用release的方式編譯出可執(zhí)行文件,然后新建一個(gè)文件夾,將可執(zhí)行文件拷貝進(jìn)去備用。
2.巧用腳本文件
這里以Server可執(zhí)行文件為例。
在新建的文件夾下,新建兩個(gè)腳本文件:
? pack.sh
? Server.sh: 這個(gè)腳本文件名必須和要發(fā)布的程序名字相同,所以為Server
新建文件后,文件夾包含內(nèi)容如下:
添加腳本
向pack.sh文件里添加以下內(nèi)容:
#!/bin/sh
exe=“Server” #你需要發(fā)布的程序名稱
des="/home/mrzhong/server" #創(chuàng)建文件夾的位置
deplist=$(ldd $exe | awk ‘{if (match($3,"/")){ printf("%s "),$3 } }’)
cp $deplist $des
然后向Server.sh文件里,添加以下內(nèi)容(內(nèi)容不需要更改):
#!/bin/sh
appname=basename $0 | sed s,\.sh$,,
dirname=dirname $0
tmp="KaTeX parse error: Expected '}', got '#' at position 9: {dirname#??}" if [ "{dirname%KaTeX parse error: Expected 'EOF', got '}' at position 4: tmp}?" != "/" ]; the…PWD/dirnamefiLDLIBRARYPATH=dirname fi LD_LIBRARY_PATH=dirnamefiLDL?IBRARYP?ATH=dirname
export LD_LIBRARY_PATH
dirname/dirname/dirname/appname “$@”
執(zhí)行腳本
終端進(jìn)入文件夾目錄,運(yùn)行:
./pack.sh
可執(zhí)行文件依賴的鏈接庫(kù)將會(huì)拷貝到所在的目錄,如圖:
在其它主機(jī)里面使用和可執(zhí)行文件同名的腳本文件(這里為Server.sh)運(yùn)行程序即可。
打包發(fā)布
最后將這個(gè)文件打包后拷貝到其它主機(jī)上即可運(yùn)行
linux (centos)c++項(xiàng)目打包并部署到其它服務(wù)器運(yùn)行
總結(jié)發(fā)版步驟:
1、使用cmake 打包成可執(zhí)行文件(這個(gè)過(guò)程也很復(fù)雜,這里不做討論)
2、使用ldd 查看可執(zhí)行文件依賴庫(kù),可以記錄一下個(gè)數(shù),和導(dǎo)出的文件做對(duì)比
ldd可執(zhí)行文件。
3、編寫(xiě)shell腳本,把可執(zhí)行文件導(dǎo)出到指定的文件夾
3.1、新建文件夾 lddlib.sh
vim lddlib.sh輸入下面的腳本
deplist=$( ldd $1 | awk ‘{if (match($3,"/")){ print $3}}’ )
cp -L -n $deplist $2
3.2、執(zhí)行l(wèi)ddlib.sh
lddlib.sh 可執(zhí)行程序,存放依賴庫(kù)的目錄
4、把可執(zhí)行文件和依賴庫(kù)到拷貝到服務(wù)器,使用rz 和 sz 進(jìn)行文件轉(zhuǎn)移
5、設(shè)置環(huán)境變量
臨時(shí)有效方式:可以做測(cè)試或者沒(méi)有權(quán)限時(shí)這樣做
export LD_LIBRARY_PATH=/dev/nm/project/Spider/lib
永久有效方式:
可以把依賴的庫(kù)都拷貝到/usr/lib 下
然后執(zhí)行 /sbin/ldconfig
到這里就可以運(yùn)行了!
在Linux下用sh打包發(fā)布基于opencv的C++可執(zhí)行文件
問(wèn)題:在ubuntu16.04上用Clion寫(xiě)好的C++程序,用到了第三方庫(kù)opencv,現(xiàn)在需要在一個(gè)沒(méi)有裝opencv,甚至沒(méi)有裝Clion的linux電腦下執(zhí)行,應(yīng)該怎么打包發(fā)布呢?
解決過(guò)程:
1.準(zhǔn)備已運(yùn)行好的可執(zhí)行程序
2.新建腳本文件
2.1 pack.sh
2.2 untitled5.sh
3.執(zhí)行腳本
4.需要注意的問(wèn)題
問(wèn)題:在ubuntu16.04上用Clion寫(xiě)好的C++程序,用到了第三方庫(kù)opencv,現(xiàn)在需要在一個(gè)沒(méi)有裝opencv甚至沒(méi)有裝Clion的linux電腦下執(zhí)行,應(yīng)該怎么打包發(fā)布呢?
ubuntu打包opencv和C++可執(zhí)行程序。
一開(kāi)始用寫(xiě)的腳本復(fù)制依賴庫(kù),但腳本運(yùn)行出錯(cuò),不曉得是啥的問(wèn)題。然后一個(gè)一個(gè)依賴庫(kù)的復(fù)制。最后打包發(fā)到別的電腦上顯示找不到依賴庫(kù),之后添加環(huán)境變量,依然出錯(cuò)。
在Linux下用sh打包發(fā)布可執(zhí)行文件:這個(gè)方法直接就成功了,感謝這位博主。
可以同時(shí)參考這兩個(gè)文章,能大概了解打包過(guò)程并解決問(wèn)題。)
解決過(guò)程:
用的C++編譯軟件是CLion,實(shí)際上與Qt的打包過(guò)程相同,可參照上面的第二個(gè)博客。
1.準(zhǔn)備已運(yùn)行好的可執(zhí)行程序
以寫(xiě)的程序?yàn)槔?#xff0c;先新建文件夾(名字隨意)test 。
將之前已運(yùn)行好生成的可執(zhí)行文件放入test。我運(yùn)行的程序包名為untitled5,這里生成的可執(zhí)行文件也叫做untitled5??蓤?zhí)行文件在如下位置:
將這些文件復(fù)制到新建的test文件夾中:
2.新建腳本文件
需要新建兩個(gè)腳本文件:pack.sh 和 untitled5.sh。
pack.sh:主要是為了復(fù)制可執(zhí)行文件untitled5所需要的依賴庫(kù)。
untitled5.sh:是為了在別的電腦上運(yùn)行可執(zhí)行文件untitled5。
2.1 pack.sh
pack.sh腳本的內(nèi)容為:
#!/bin/sh
exe=“untitled5” #發(fā)布的程序名稱
des="/home/bei/Desktop/test" #創(chuàng)建文件夾的位置
deplist=$(ldd $exe | awk ‘{if (match($3,"/")){ printf("%s "),$3 } }’)
cp $deplist $des
此腳本的作用在于,會(huì)將untitled5所需要的依賴庫(kù)復(fù)制到創(chuàng)建的文件夾的位置,放到test中。
當(dāng)程序名稱和新建文件夾名稱位置和我的不同時(shí),只需修改第二行和第三行的內(nèi)容。
2.2 untitled5.sh
untitled5.sh的腳本內(nèi)容為:
#!/bin/sh
appname=basename $0 | sed s,\.sh$,,
dirname=dirname $0
tmp="KaTeX parse error: Expected '}', got '#' at position 9: {dirname#??}" if [ "{dirname%KaTeX parse error: Expected 'EOF', got '}' at position 4: tmp}?" != "/" ]; the…PWD/dirnamefiLDLIBRARYPATH=dirname fi LD_LIBRARY_PATH=dirnamefiLDL?IBRARYP?ATH=dirname
export LD_LIBRARY_PATH
dirname/dirname/dirname/appname “$@”
此腳本的作用是執(zhí)行可執(zhí)行程序untitled5。
腳本內(nèi)容不需要修改,直接復(fù)制即可。
3.執(zhí)行腳本
在pack.sh所在位置打開(kāi)終端,運(yùn)行:
sh ./pack.sh
會(huì)發(fā)現(xiàn)test中出現(xiàn)了許多依賴庫(kù)文件,如圖:
此時(shí),已經(jīng)可以將test文件夾打包發(fā)到別的linux電腦上,在untitled5所在位置打開(kāi)終端,運(yùn)行untitled5.sh腳本:
sh ./untitled5.sh
即可成功運(yùn)行。
4.需要注意的問(wèn)題
但需要注意的一點(diǎn)是,如果可執(zhí)行程序中不需要圖片、視頻等需要在項(xiàng)目中提前準(zhǔn)備好的之類的資源,按照以上方法打包不存在問(wèn)題。但如果程序執(zhí)行過(guò)程中需要這類的資源,在打包test時(shí),一定要將需要的資源打包進(jìn)去,否則程序會(huì)出錯(cuò)。比如我的程序需要用到一些圖片和視頻,在沒(méi)有將這些資源打包進(jìn)去前,執(zhí)行腳本程序會(huì)出現(xiàn)錯(cuò)誤:
有新建了一個(gè)文件夾Test,將test放入Test中,再將需要用到資源所在文件夾放入Test中。如圖:
需要注意的是,不能將video和video_one直接放入test中,這樣依然會(huì)出錯(cuò)。也不能單獨(dú)將需要的資源直接放入Test中。這應(yīng)該是與整個(gè)項(xiàng)目的結(jié)構(gòu)有關(guān),拿這個(gè)項(xiàng)目為例,整體結(jié)構(gòu)如下:
實(shí)際上,在主程序中只用到了map.jpg以及NoObjects.png這兩張圖片,但不能將這兩張圖片直接放入Test中,也就是說(shuō),test相當(dāng)于cmake-build-release(cmake-build-release中存放是可執(zhí)行程序及相關(guān)文件),video存放的是程序需要的資源,video_one存放的是程序運(yùn)行過(guò)程中需要保存的資源,如果Test中沒(méi)有將video和video_one放在與test文件夾同一目錄下,程序就會(huì)出現(xiàn)問(wèn)題。沒(méi)有video,程序會(huì)運(yùn)行出錯(cuò);沒(méi)有video_one,程序運(yùn)行過(guò)程中想要保存的資源就保存不了。
在打包的過(guò)程中注意以上問(wèn)題。
Linux打包opencv和C++可執(zhí)行程序
在Linux上寫(xiě)好的C++程序,用到了第三方庫(kù)opencv,現(xiàn)在需要在一個(gè)沒(méi)有裝opencv的linux電腦下執(zhí)行,做個(gè)筆記,希望對(duì)需要的人有幫助
參考:
http://www.ngui.cc/51cto/show-6859.html
https://blog.csdn.net/qq_28901541/article/details/97310437
1.準(zhǔn)備編譯好的c++程序以及可執(zhí)行文件
圖一
上面目錄是經(jīng)過(guò)如下編譯后的結(jié)果,
cmake .
make -j4
./yolov4是編譯好的可執(zhí)行文件
yolov4是c++代碼
.bin和.param是轉(zhuǎn)后的ncnn模型
2.將編譯后ncnn靜態(tài)庫(kù)和代碼復(fù)制到上圖目錄下
git clone https://github.com/Tencent/ncnn.git #可使用鏡像加速github.com.cnpmjs.org和git.sdut.me/
cd ncnn
mkdir -p build
cd build
cmake …
make -j4
make install
編譯后ncnn靜態(tài)庫(kù):./ncnn/build/install
2.1.在圖一新建ncnn文件夾,如下,
mkdir ncnn
cd ncnn
mkdir include
mkdir lib
2.2.將編譯后ncnn靜態(tài)庫(kù)和文件移動(dòng)到2.1新建的相應(yīng)位置
./ncnn/build/install/include/ncnn -> 2.1中ncnn/include下
./ncnn/build/install/lib -> 2.1中ncnn/lib/下
3.移動(dòng)依賴需要的腳本
需要新建兩個(gè)腳本文件:pack.sh 和 yolov4.sh。(yolov4.sh文件名需要和可執(zhí)行文件名一致)
pack.sh:主要是為了復(fù)制可執(zhí)行文件untitled5所需要的依賴庫(kù)。
yolov4.sh:是為了在別的電腦上運(yùn)行可執(zhí)行文件yolov4。
pack.sh #此將c++執(zhí)行需要的opencv依賴庫(kù)單獨(dú)copy出來(lái),用于在其它機(jī)器上用
#!/bin/sh
exe=“yolov4” #發(fā)布的程序名稱
des="./opencv3.4" #創(chuàng)建文件夾的位置
deplist=$(ldd $exe | awk ‘{if (match($3,"/")){ printf("%s "),$3 } }’)
cp $deplist $des
執(zhí)行的出現(xiàn)了問(wèn)題,把腳本在命令行下分開(kāi)執(zhí)行了
yolov4.sh
#!/bin/sh
appname=basename $0 | sed s,\.sh$,, # $0是腳本文件名,所以腳本文件一定要和可執(zhí)行文件名保持一致
dirname=dirname $0
tmp="KaTeX parse error: Expected '}', got '#' at position 9: {dirname#??}" if [ "{dirname%KaTeX parse error: Expected 'EOF', got '}' at position 4: tmp}?" != "/" ]; the…PWD/dirnamefiLDLIBRARYPATH=dirname fi LD_LIBRARY_PATH=dirnamefiLDL?IBRARYP?ATH=dirname
export LD_LIBRARY_PATH
dirname/dirname/dirname/appname “$@”
4.執(zhí)行腳本
./pack.sh
即可成功運(yùn)行。
最終目錄
5.復(fù)制到其它機(jī)器,編譯c++文件
sh yolov4.sh
cmake .
make -j4
./yolov4 #執(zhí)行正常
CMakeLists.txt少了個(gè) project(yolov4) ,添加上就ok了
在win10 Ubuntu子系統(tǒng)下編寫(xiě)pack.sh時(shí)候
執(zhí)行sh pack.sh報(bào)錯(cuò)
調(diào)查后參考:https://www.cnblogs.com/willingtolove/p/13387424.html
window下的換行是回車符+換行符,也就是\r\n,而unix下是換行符\n。
使用vim打開(kāi)xxx.sh
vim xxx.sh
直接輸入“:set ff”,不用進(jìn)編輯模式;
如果輸出“fileformat=dos”,說(shuō)明文本格式是windows下的;
直接輸入“:set ff = unix” 即可。
參考鏈接:
https://www.cnblogs.com/nmhome/p/14776440.html
https://blog.csdn.net/mjj1024/article/details/107110640
https://blog.csdn.net/yiersab/article/details/112391845
https://blog.csdn.net/zhizhengguan/article/details/105482209
https://www.cnblogs.com/wangxujoy/p/12499839.html
總結(jié)
以上是生活随笔為你收集整理的linux C++打包程序总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 深度学习编译器Data Flow和Con
- 下一篇: JIT Code Generation代