在Linux上写好的C++程序,用到了第三方库opencv,现在需要在一个没有装opencv的linux电脑下执行,做个笔记,希望对需要的人有帮助
参考:
http://www.ngui.cc/51cto/show-6859.html
https://blog.csdn.net/qq_28901541/article/details/97310437
1,准备编译好的c++程序以及可执行文件
图一
上面目录是经过如下编译后的结果,
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
即可成功运行。
我的最终目录
5,复制到其他机器,编译c++文件
sh yolov4.sh
cmake .
make -j4
./yolov4 #执行正常
我的CMakeLists.txt少了个 project(yolov4) ,添加上就ok了
在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
” 即可。