<style type="text/css">
<!--
@page
{margin:2cm}
p
{margin-bottom:0.21cm}
p.text-body-indent
{margin-left:0.5cm}
p.我的格式-western
{margin-left:0.5cm;
font-family:"DejaVu Sans",sans-serif;
font-size:10pt}
p.我的格式-cjk
{margin-left:0.5cm;
font-family:"DejaVu Sans",sans-serif;
font-size:10pt}
p.我的格式-ctl
{margin-left:0.5cm}
pre.cjk
{font-family:"DejaVu Sans Condensed",monospace}
-->
</style>
初次尝试 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主题效果。看来还是编译的时候出了问题,我再去查查问题。写下这篇文章留作纪念。
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com