设为首页 收藏本站
查看: 623|回复: 0

[经验分享] 初次尝试Linux下静态编译Qt应用程序

[复制链接]

尚未签到

发表于 2016-3-8 08:11:54 | 显示全部楼层 |阅读模式
<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的多年经验,我想要的是Qtlib库,详细地说是静态库(后缀名是a),因为我想静态编译Qt嘛。发现我的/home文件夹只有50M了!原来我粗心,把exampledemo编译了。尤其是example,有4G!可恶,我果断地把example文件夹和demo文件夹删除了,包含binincludelib三个文件夹还有一些不知何用的文件夹总共加起来有一个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多个错误!打印都不完!
DSC0000.png

注意到了吗?这些库函数都带有头的,于是我根据这些头,猜想他们的库文件名,有些是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主题都没了,而且字体非常难看!
DSC0001.png

此外还会出现这些错误:
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

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-187780-1-1.html 上篇帖子: linux下解压命令大全和 rpm命令使用简介 下篇帖子: Linux中Tomcat和JDK安装及环境变量配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表