Linux打包opencv和C++可执行程序

在Linux上写好的C++程序,用到了第三方库opencv,现在需要在一个没有装opencv的linux电脑下执行,做个笔记,希望对需要的人有帮助

参考:

http://www.ngui.cc/51cto/show-6859.html

https://blog.csdn.net/qq_28901541/article/details/97310437

1,准备编译好的c++程序以及可执行文件

Linux打包opencv和C++可执行程序_第1张图片

图一

上面目录是经过如下编译后的结果,

cmake .
make -j4

# ./yolov4是编译好的可执行文件
# 
# yolov4是c++代码
# 
# *.bin和*.param是转后的ncnn模型

2,将编译后ncnn静态库和代码复制到上图目录下

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静态库:./ncnn/build/install

2.1,在图一新建ncnn文件夹,如下,

mkdir ncnn
cd ncnn
mkdir include
mkdir lib

2.2,将编译后ncnn静态库和文件移动到2.1新建的相应位置
 

./ncnn/build/install/include/ncnn  -> 2.1中ncnn/include下

./ncnn/build/install/lib  -> 2.1中ncnn/lib/下

3,移动依赖需要的脚本

需要新建两个脚本文件:pack.sh 和 yolov4.sh。(yolov4.sh文件名需要和可执行文件名一致)

pack.sh:主要是为了复制可执行文件untitled5所需要的依赖库。

yolov4.sh:是为了在别的电脑上运行可执行文件yolov4。

pack.sh #此将c++执行需要的opencv依赖库单独copy出来,用于在其他机器上用

#!/bin/sh  
exe="yolov4" #发布的程序名称
des="./opencv3.4" #创建文件夹的位置
deplist=$(ldd $exe | awk  '{if (match($3,"/")){ printf("%s "),$3 } }')  
cp $deplist $des

我执行的出现了问题,把脚本在命令行下分开执行了

yolov4.sh

#!/bin/sh
appname=`basename $0 | sed s,\.sh$,,` # $0是脚本文件名,所以脚本文件一定要和可执行文件名保持一致
dirname=`dirname $0`
tmp="${dirname#?}"
if [ "${dirname%$tmp}" != "/" ]; then
dirname=$PWD/$dirname
fi
LD_LIBRARY_PATH=$dirname
export LD_LIBRARY_PATH
$dirname/$appname "$@"

4,执行脚本

./pack.sh

即可成功运行。

我的最终目录

Linux打包opencv和C++可执行程序_第2张图片

5,复制到其他机器,编译c++文件

sh yolov4.sh
cmake .
make -j4
./yolov4 #执行正常

我的CMakeLists.txt少了个 project(yolov4) ,添加上就ok了

Linux打包opencv和C++可执行程序_第3张图片

在win10  Ubuntu子系统下编写pack.sh时候

执行sh pack.sh报错

调查后参考:https://www.cnblogs.com/willingtolove/p/13387424.html

window下的换行是回车符+换行符,也就是\r\n,而unix下是换行符\n。

使用vim打开xxx.sh

vim xxx.sh

直接输入“:set ff”,不用进编辑模式;
如果输出“fileformat=dos”,说明文本格式是windows下的;
直接输入“:set ff = unix” 即可。

你可能感兴趣的:(c++,cmake,c++,linux)