Linux碎碎念
目录
前言
由于软件平台的需求,在八月底到九月底一个月完成了Linux下Ubuntu的程序的编译,以下对最近遇到的一些问题做个大概的复盘,旨在为接下来写更加细化的操作列一个大纲。
一、搭建Ubuntu平台
搭建Ubuntu平台,最初始版本是在虚拟机上进行操作,安装了需要使用的Qt和Gcc,打算使用QtCreator作为Qt程序的IDE,使用Gcc作为编译工具。
安装Qt可直接在官网上进行下载run包进行安装。具体的网址可参照百度进行搜索,这里需要提的是现在的镜像网址中间缺失了4.*和5.*的部分版本,需要下载其中缺失版本的可移步至http://download.qt.io/new_archive/qt/ 。
安装Gcc可使用终端进行安装,简单快捷,sudo apt-get install build-essential,具体某一个Linux系统的不同版本安装软件方法依旧可参考度娘。
二、VNC部分搭建
搭建好工具运行平台之后,由于有需要桌面远程控制的需求,因此需要安装VNC,VNC安装时需要安装X11桌面进行支持,据说会更好进行支持桌面控制,在虚拟机上使用Ubuntu时若要使用VNC进行控制,VMware虚拟机默认设置中默认不能进行VNC控制,在设置中需要将其开启。
可在被控制的Ubuntu系统内安装好VNC Server后,使用命令进行启动,在要控制的机器上使用VNC View进行控制。注:在Ubuntu中可以在应用商店中安装VNC,但是需要有网络进行支持,登录同一个账户,使用云进行控制,这种情况不适用于使用局域网的情况(PS:我大概是这么理解的,如有错误欢迎指正)。VNC的默认端口号是5900,之后启动一个服务依次端口号+1, 5901 5902
三、Makefile文件
使用Makefile文件进行C++库的编译,具体Makefile文件的编写需要专门写一篇文章才能将其最基础的使用描述清楚,在此不做详述。在此留坑,以后来补。
四、Qt相关
1.在Linux上无法双击执行直接编好的程序。
在Linux Qt下编写可执行程序需要在pro文件中添加 QMAKE_LFLAGS += -no-pie,这样的才变为可执行程序,否则默认为库的类型。
2.代码块使用
在Pro文件中用到了一个代码块,用来屏蔽Release版本中输出的调试信息qDebug()输出的信息。
pro文件中代码块的使用
<condition>{ //括号与条件在同一行
//ToDo
} //结尾括号单独列出
eg:
CONFIG(release,debug|release){
DEFINES += QT_NO_DEBUG_OUTPUT
}
3.操作office在linux上和Win上的不同
操作Word和Excel等接口在windows上Qt封装了COM接口进行使用,需要在组件中加入axcontainer,在Linux上无此组件,由于本程序需要操作表格,因此可写入csv文件进行保存,默认用表格打开。在Linux上比较官方的办法可采用wps上关于Linux的接口,libreOffice的官方接口进行使用,但由于时间紧迫,该方法未能深入研究。
4.Linux中库读取和环境变量设置
首先需要清楚的是gcc编译时读库文件的顺序。
1.在程序指定的-L 的目录下读取需要的库文件。(编译时默认不查找当前目录,需要使用-L ./进行指定)
2.寻找gcc的环境变量LIBRARY_PATH
3.寻找内定目录
/lib和/lib64
/usr/lib 和/usr/lib64
/usr/local/lib和/usr/local/lib64
其次需要了解运行时动态库的搜索路径顺序
1. 编译目标代码时指定的动态库的搜索路径。gcc -wl -rpath-指定,多个使用:进行分隔。
2.环境变量LD_LIBRARY_PATH指定的动态库搜索路径
3.配置文件/etc/ld.so.conf指定的动态库的搜索路径
4.默认的动态库搜索路径/lib ,/usr/lib
注:
1.Linux与Win不同的点在于并不搜索同一路径下的so文件,因此将其文件即使放在同一目录也可能无法运行。
2.通过终端进行环境变量的修改用于临时情况使用export 仅对该终端起作用,打开其他终端时依旧无法起作用。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/usr/libpath
3. 对于当前用户进行环境变量的修改。
在.bashrc中设置或者在./bash_profile设置,对当前用户生效。修改后需要source ~/.bashrc,可以立即生效,否则为重启后生效。
对所有用户进行修改,在/etc/profile中设置或在/etc/profile.d/中创建一个自定义的脚本。
5.程序打包
程序打包之后需要在纯净的Ubuntu环境中进行使用。
打包Qt程序可使用linuxdeployqt进行打包,也可使用shell脚本对相关需要的库进行添加,注意有的库拷贝进去的只是软连接,需要使用ldd去查看真正依赖的库,把真正所指的库复制到相关目录下,有时需要重命名。
例如要打包的程序名称为DIDS,该脚本名称为copylib.sh 首先运行该脚本。
#!/bin/sh
exe="DIDS" #你需要发布的程序名称
des="/home/usr/DIDS" #创建文件夹的位置
deplist=$(ldd $exe | awk '{if (match($3,"/")){ printf("%s "),$3 } }')
cp $deplist $des
该脚本名称设为要运行 DIDS.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 "$@"
6.运行时无法确定具体哪个库缺少
在运行程序后可能会出现xcd插件无法找到,但是又不确定到底是哪一个库没找到,可在DIDS.sh中添加如下语句。
export export QT_DEBUG_PLUGINS=1
总结
对后续留坑以及最近的大概梳理