初次尝试Linux下静态编译Qt应用程序
本来想发布我在Linux下编译的程序,发现在没有安装Qt的Linux下无法跑。这怎么办呢?本来想将Qt相关的动态链接库(后缀名为so)复制到我的应用程序旁边,然后一起发布的。我自己试了一下,基本所有的Qt程序都要libQtCore.so和libQtGui.so,但是不知道怎么回事,我想这样不方便,想自己编译Qt源代码,结果自己开始了静态编译Qt之路。
编译Qt要到Qt官方下载源代码。在这里可以下载到Qt的源代码(版本4.8.3),然后就像熟悉的tar.gz软件一样安装。基本步骤是:cd➡./configure➡makeinstall➡make。我是看了一个高手的文章之后进行快速编译的。他的文章是:这里。
花了一晚上(不知道Qt准确的编译的时间^_^),早上来看到已经编译好了Qt了。其实根据我在Windows的多年经验,我想要的是Qt的lib库,详细地说是静态库(后缀名是a),因为我想静态编译Qt嘛。发现我的/home文件夹只有50多M了!原来我粗心,把example和demo编译了。尤其是example,有4个G!可恶,我果断地把example文件夹和demo文件夹删除了,包含bin、include和lib三个文件夹还有一些不知何用的文件夹总共加起来有一个G。还好。我想尝试将静态库作为一个版本,让QtCreator识别它。但是由于自己才疏学浅,不会相关的操作!今天我向Qt论坛提问了,看有没有什么结果。
接下来说说我自己是如何解决静态编译Qt应用程序的。这种方法我在别的地方没有看过哦。比如说我想静态编译我即将发布的“纹理坐标解算”程序,开始在pro文件中仅仅添加了我项目所用的头文件和源文件。
HEADERS += \ TCWidget.h \ TCCFrame.h \ SingleSelectActions.h SOURCES += \ TCWidget.cpp \ TCCFrame.cpp \ SingleSelectActions.cpp \ main.cpp
但是这分明是默认动态编译方法嘛。我于是添加了一句“CONFIG+= static”。这怎么行!我的静态Qt版本还没有被QtCreator识别呢。于是我想了一个办法,自己链接Qt库!
其实也算简单。首先我添加了这两行:
HEADERS += \ TCWidget.h \ TCCFrame.h \ SingleSelectActions.h SOURCES += \ TCWidget.cpp \ TCCFrame.cpp \ SingleSelectActions.cpp \ main.cpp CONFIG += static LIBS += /home/jiangcaiyang/QtSDK/Desktop/QtStatic/lib/libQtCore.a \ /home/jiangcaiyang/QtSDK/Desktop/QtStatic/lib/libQtGui.a
注意,LIBS +=有两种方法,一种是使用gcc里面的ld程序自己加载库,也就是如果libQtCore.a在/usr/lib中,可以这么写:LIBS+= -lQtCore,前缀lib可以不用,还有一种则是直接指定静态库的路径,我就是使用第二种方法。但是700多个错误!打印都不完!
注意到了吗?这些库函数都带有头的,于是我根据这些头,猜想他们的库文件名,有些是libX11.a里面的,有些是libXM.a里面的,于是在.pro后面添加了这几句:
HEADERS += \ TCWidget.h \ TCCFrame.h \ SingleSelectActions.h SOURCES += \ TCWidget.cpp \ TCCFrame.cpp \ SingleSelectActions.cpp \ main.cpp CONFIG += static LIBS += /home/jiangcaiyang/QtSDK/Desktop/QtStatic/lib/libQtCore.a \ /home/jiangcaiyang/QtSDK/Desktop/QtStatic/lib/libQtGui.a \ /usr/lib/i386-linux-gnu/libX11.a \ /usr/lib/i386-linux-gnu/libSM.a \ /usr/lib/i386-linux-gnu/libICE.a \ /usr/lib/i386-linux-gnu/libXext.a \ /usr/lib/i386-linux-gnu/libxcb.a \ /usr/lib/i386-linux-gnu/libXau.a \ /usr/lib/i386-linux-gnu/libXdmcp.a
最后竟然链接竟然成功了!只不过还是一个Bug,运行的时候Ubuntu的Unity主题都没了,而且字体非常难看!
此外还会出现这些错误:
QObject::setParent:Cannot set parent, new parent is in a different thread
QObject::startTimer:QTimer can only be used with threads started with QThread
QObject::setParent:Cannot set parent, new parent is in a different thread
QObject::startTimer:QTimer can only be used with threads started with QThread
QObject::setParent:Cannot set parent, new parent is in a different thread
QObject::startTimer:QTimer can only be used with threads started with QThread
QObject::setParent:Cannot set parent, new parent is in a different thread
QObject::startTimer:QTimer can only be used with threads started with QThread
QObject::setParent:Cannot set parent, new parent is in a different thread
QObject::startTimer:QTimer can only be used with threads started with Qthread
用命令提示符,带上style参数,像这样:a-stylecleanlooks还是可以显示其它的主题效果的,但是就是没有Unity主题效果。看来还是编译的时候出了问题,我再去查查问题。写下这篇文章留作纪念。