QT源码编译成静态库

QT源码非常庞大,本身也有现成的编译好的动态库与安装包,正常来说是不需要编译静态库的,但是如果需要基于QT去开发自己的SDK(动态库)或是在LINUX下面基于QT框架进行开发,那静态库就是十分好的一个选择。原因是基于QT框架开发自己的SDK,会需要依赖很多的QT动态库(最起码要基于QtCore)这样提供给客户的SDK就会有多个DLL,使用静态库就可以实现提供给客户的只有一个DLL;在LINUX下基于QT框架就更不用说了,既要打包QT的动态库,又要将动态库所在的路径添加到环境变量中,甚是麻烦。

1.源码获取,可以到QT的官网下载(下载地址是https://download.qt.io/),windows下也可以通过QT安装包安装时候选择QT源码,安装源码;

2.源码配置命令

./configure -prefix 安装路径 -debug-and-release -opensource -confirm-license -static -qt-xcb -no-opengl -nomake examples -nomake tests

1)-prefix 安装路径 指定make install的路径;

2)-debug-and-release 指定编译debug或release版本或都编译;

3)-opensource 是必须的,指定是开源;

4)-confirm-license 也是必须的,指定确认开源协议;

5)-static 是关键,指定编译成静态库;

6)-qt-xcb windows下是不需要的,linux下是必须的,没有这个在linux下运行编译出来的程序后会提示xcb错误;

7)-no-opengl 指定不需要opengl(虚拟机安装的Ubuntu 16.4中,就必须要这个);

8)-nomake examples 指定不编译示例程序;

9)-nomake tests 指定不编译测试程序;

10)还有一些另外的设置可以网上查找,上述设置均为比较基本的设置。

3. configure配置缓存之争(巨坑),通过configure配置后,如果要修改配置,那最好把原来的源码删除(记得配置前先把源码备份好),再拿新的没有配置过的源码再新配置,否则新的配置很大可能不会生效;

4.Windows下编译-MD和-MT之争

1)首先来说明一下-MD和-MT究竟是个什么东西,两者均是VS工程中运行库的配置(如下图所示),那运行库的配置又是指什么呢?就是你编译出来的动态库或后续你编译出来的程序运行环境的甚至;

2)两者的区别又是什么呢?MD编译,运行时依赖的库在系统中查找,优点是编译出来的库或程序文件比较小,缺点是需要另外提供依赖的库(比如VS的运行时库);MT编译,依赖会被编译到输出文件中,优点是放到另电脑直接能运行,不需要另外的依赖,缺点是编译出来的库或程序会比较大;

3)两者如何选择呢,如果QT的静态库是需要提供给MFC程序或使用MD编译的程序,则选则MD编译;如果QT的静态库是需要提供给使用MT编译的程序,则选择MT编译,QT库默认是使用MD编译,网上有人说直接修改成MT编译,并非一定的看具体需求进行选择

4)修改成MT编译的方法(注意要在配置前修改):在源码中找到"qtbase\mkspecs\common"文件夹下的"msvc-desktop.conf"文件,然后打开文件,找到以下编译标志:

QMAKE_CFLAGS_RELEASE    = -O2 -MD

QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MD -Zi

QMAKE_CFLAGS_DEBUG      = -Zi -MDd

将其中的MD全部修改为MT(见粗体字,也就是将动态编译修改为静态编译):

QMAKE_CFLAGS_RELEASE    = -O2 -MT

QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MT -Zi

QMAKE_CFLAGS_DEBUG      = -Zi -MTd

5.Linux下配置和编译的坑

1)在Ubuntu16.04下进行配置时,设置了-qt-xcb配置,在配置时候可能会提示xcb错误的配置失败(类似错误:ERROR: Feature ‘xcb’ was enabled, but the pre-condition ‘features.thread && features.xkbcommon && libs.xcb’ failed),这时候就需要先通过sudo apt-get install libxcb*和sudo apt-get install libxkbcommon*这两个命令先安装xcb相关的库即可配置成功;

2)配置成功后进行make编译时候可能会出现缺少X11头文件的错误,这时候就需要通过apt-get install libx11-dev这个命令安装X11相关的库,然后按前面第3点所说的删除,删除源码用一份新的源码重新配置,再重新进行make编译即可编译成功

6.Windows下面编译器使用说明

1)找到使用的VS(通常是在开始菜单)中对应的"x86/x64 Native Tools Command Prompt for VS 2017"(作者用的是VS2017编译),如下图所示;

2)编译32位的静态库就用x86,编译64位就用x64,即可。

7.静态库使用注意

当静态库编译好后,在QTCreator是使用静态库套件需要进行以下操作:

1)在“工具”菜单中选择“选项”弹出选项对话框,然后选择“Kits”项,选择“Qt Versions”页,单击添加将QT静态库编译出来的qmake添加进去,如下图所示;

2)再切换到“构建套件页”再添加一个新的构建套件注意编译器选择对应的版本,Qt Version一项选择新添加的静态库套件,如下图所示;

3)当使用QT静态库套件编译出来的静态库时候,除了要添加本身依赖的QT静态库外,还需要按照缺少的接口,将依赖的一此系统库也添加进去,如下图例子(该例子是一个QT动态库的套件,使用QT静态库编译的静态库的编译成动态库的例子,听起来有点拗口,其实目的很简单,通过QT框架编译一个只提供一个DLL给客户使用的SDK),静态库CRCP2100.lib,在编译时候使用了了Qt5Core和Qt5Network静态库,而Qt5Core库依赖qtpcre静态库,所以需要从编译出来的QT静态库套件中将这个三静态库拷贝过来并添加到工程,然后再将Advapi32等依赖的系统库添加到工程中即可。

下面这图是VS的一个例子,也是要将本下依赖的QT的静态库添加进去,同时依赖的系统库也是要添加进来的。

4)Linux下面使用QT静态库编译的界面程序时候会提示缺少fonts文件夹(如下图所示),并且所有文字都会显示不出来,此时只需要在找一个.ttf文件添加到QFontDatabase即可正常显示文字,例如:QFontDatabase::addApplicationFont(":Alibaba-PuHuiTi-Regular.ttf"),Alibaba-PuHuiTi-Regular.ttf是网上找的一个阿里的开源的文字库,注意ttf文件要支持你使用的文字编码,如作者使用的中文,用不支持中文的ttf文件会显示为乱码;

小Tips:Linux下面编译的QT界面程序是不能直接双击运行的,需要通过命令行运行,如果希望能够双击即可运行程序,在工程文件(.pro)中添加QMAKE_LFLAGS += -no-pie重新编译,即可得到一个可双击运行的界面程序。

吐槽一下,Linux程序依赖库不在程序当前目录查找真是一个很比较费劲的做法,习惯了用windows的开发人员真是有点不理解,还有就是GLIBC和GLIBCXX,也是很坑人,为了保证高编译出来的程序能直接放到别的系统运行,还是用个低版本的Linux的系统来编译吧,不然你就会喜提GLIBC和GLIBCXX版本过高运行不了的问题了。

上述均是作者在编译和使用QT的静态库套件时候遇到一些问题的小结,希望对大家有帮助。

全部评论

相关推荐

03-16 13:56
湖南大学 C++
牛客872108596号:到现在没消息是挂了吗查看图片
点赞 评论 收藏
分享
评论
1
3
分享

创作者周榜

更多
牛客网
牛客企业服务