😁
在Windows系统下,很容易就能将qt工程打包成一个单独的可执行程序,在任意Windows环境都能执行。在Linux系统编译出来的qt工程,就相对的没那么容易,网上教程繁多,这里我前前后后折腾了很久,终于弄到了可靠的方法。
准备
首先在Release
模式下Run
一遍
![](https://img-blog.csdnimg.cn/c84df66e6d6a4f019a34c5ccd83a2af3.png)
![](https://img-blog.csdnimg.cn/7a00669f95ca4007a332c5400b1d0aeb.png)
我们的程序名是navDebuggingTools
,我们可以在build-navDebuggingTools-Desktop_Qt_5_12_9_GCC_64bit-Release
目录下,打开终端,进入当前目录,输入命令
ldd navDebuggingTools
就可以知道我们这个程序的全部依赖库,即使用到一些不是Qt
或Linux
系统的库,也能获取到
![](https://img-blog.csdnimg.cn/788195665e0647b0a52e80927ada6d02.png)
这里第2条就是我额外安装的log4cplus
日志库
ldd.sh
拉取依赖库,写个脚本会容易很多,就不用一个个去找
同样的,在build-navDebuggingTools-Desktop_Qt_5_12_9_GCC_64bit-Release
目录下,创建该脚本
sudo vi ldd.sh
然后将下面内容复制到脚本当中
#!/bin/bash
LibDir=$PWD"/lib"
Target=$1
lib_array=($(ldd $Target | grep -o "/.*" | grep -o "/.*/[^[:space:]]*"))
$(mkdir $LibDir)
for Variable in ${lib_array[@]}
do
cp "$Variable" $LibDir
done
接着给脚本添加权限
sudo chmod 777 ldd.sh
拉取依赖库
1.程序依赖库
打开终端,进入到脚本所在目录,执行命令
./ldd.sh navDebuggingTools
就会得到一个lib
文件夹
![](https://img-blog.csdnimg.cn/5402df0004b44cd8894aca70e910a544.png)
这时,我们将lib
文件夹中的文件,以及navDebuggingTools
程序放进一个新的文件夹,以便后续管理
2.Qt依赖库
将ldd.sh
脚本复制到Qt
安装目录的platforms
文件夹中,执行./ldd.sh libqxcb.so
,将会获得一个lib文件夹
![](https://img-blog.csdnimg.cn/3ab9a27a8cca4bc6bfc91da2959d1b91.png)
把整个platforms
文件夹复制到之前新建的文件夹nav
中,
然后将其中lib
文件夹内的文件剪切到nav
中,重复的依赖库选择替换即可
到此时,就可以双击navDebuggingTools
程序,运行起来
在其他机器运行
把整个文件夹nav
,移动到其他新的未安装任意环境的Linux
系统下,是没办法直接运行的
听公司同事说,
Windows
下,运行程序navDebuggingTools
的话,系统会从程序所在目录找寻依赖库,而从我之前在Windows
中打包qt
工程的经历来说,确实是这样,也就是说,依赖库和程序在同一目录,就可以双击执行程序
而在Linux
下,则不是这样。所以需要一些额外的操作
步骤
- 进入到
/etc/ld.so.conf.d
目录内,创建一个和程序同名的.conf
文件 - 将程序所在路径添加到该文件中
- 最后执行命令
sudo ldconfig
刷新连接
注意事项
第一步:
这里有一个省力的操作,因为/etc
内有很多文件和文件夹,找ld.so.conf.d
文件夹可能有点麻烦
进入/etc
文件夹,打开终端,输入cd ld.
,按一下Tab
键,就能完整文件夹名ld.so.conf.d
然后执行sudo vi navDebuggingTools.conf
第二步:
将nav
文件夹所在路径,最后加个/
,然后写到navDebuggingTools.conf
文本中;
例如:/home/saite/nav/
第三步:
一定要sudo
做完这三步之后,就可以双击运行程序啦
写成脚本
写个脚本nav_ldconfig.sh
,一条命令./nav_ldconfig.sh
就完成上面三步
tar=$PWD"/navDebuggingTools.conf"
echo $PWD"/" >> $tar
sudo mv $tar "/etc/ld.so.conf.d/"
sudo ldconfig
网上还找到了个脚本,可以不需要上面三步直接运行程序,但每次想要运行程序,都要执行这个脚本
脚本必须和程序同名,且在同一目录下
navDebuggingTools.sh
#!/bin/sh
appname=`basename $0 | sed s,\.sh$,,`
dirname=`dirname $0`
tmp="${dirname#?}"
if [ "${dirname%$tmp}" != "/" ]; then
dirname=$PWD/$dirname
fi
LD_LIBRARY_PATH=$dirname
export LD_LIBRARY_PATH
$dirname/$appname "$@"
开权限
sudo chmod 777 navDebuggingTools.sh
然后要运行程序时,执行命令
./navDebuggingTools.sh