Qt pro pri 文件解析

http://blog.csdn.net/cloud_castle/article/category/2123873   Qt5官方demo解析集


本系列所有文章可以在这里查看http://blog.csdn.net/cloud_castle/article/category/2123873

让我们把.pro和.pri放在一起看:

analogclock.pro:

[cpp] view plain copy
  1. include(../rasterwindow/rasterwindow.pri)  
  2.   
  3. # work-around for QTBUG-13496  
  4. CONFIG += no_batch  
  5.   
  6. SOURCES += \  
  7.     main.cpp  
  8.   
  9. target.path = $$[QT_INSTALL_EXAMPLES]/gui/analogclock  
  10. INSTALLS += target  


rasterwindow.pri:
[cpp] view plain copy
  1. INCLUDEPATH += $$PWD  
  2. SOURCES += $$PWD/rasterwindow.cpp  
  3. HEADERS += $$PWD/rasterwindow.h  
好像是第一次讲Qt的pro文件,其实我们很有必要理清这个小小的pro文件到底带给了我们什么东西,我们一句一句看:

首先,pri是什么,简单来说,可以理解为(project include),即包含工程。在做实际项目的时候,大多数情况下我们用到的类可能并不是自己写的,而是以打包(文件夹)的形式拿过来,并且,所有的文件都放在一个目录似乎也难以维护。那么我们创建一个pri文件,并在pro中include它就好了,而include(../rasterwindow/rasterwindow.pri)将被展开成pri文件中的内容。(../是什么?一个"."是当前目录,两个"."是上级目录)另外,Qt中还有.prf和.prl文件,具体可参考<浅谈 qmake 之 pro、pri、prf、prl文件>


那么$$PWD又是什么呢?在qmake工程文件中,我们可以利用$$var来取一个变量var的值,这里的PWD就是当前目录的绝对路径了。

OK,现在我们把.pri文件中的内容在.pro中展开,第二句我们又糊涂了,CONFIG += no_batch似乎是为了解决QTBUG-13496这个Bug存在的。那如果我们想知道这个Bug是什么,帖这段网址去看看https://bugreports.qt-project.org/browse/QTBUG-13496。Qt官方对这个Bug是这么描述的:nmake gives a wrong source file to the compiler

然后在下面一般会有合适的解决方案。


$$[QT_INSTALL_EXAMPLES],这里的QT_INSTALL_EXAMPLES是Qt配置选项的值,它不是一个变量,是你装好Qt以后就定好的一个值,这里是你Qt官方demo的顶层绝对路径。有关qmake的各项参数,具体可以参考<qmake 乱乱乱谈(一)>


既然谈到了pro文件,Qt += XXX不得不谈,既然要编译程序,无非就是预处理、编译和链接,编译预处理要展开我们的宏,展开包含的头文件,链接时呢,我们需要链接器能找到我们的库。

Qt在pro文件中实际上默认省略了两句话 CONFIG += qt 和 QT += core。第一句话告诉qmake,你可以到$QTDIR/include目录下去找头文件。当然,因为这个目录下都是文件夹,qmake找不到实际的头文件。然后它又告诉qmake,“我们的库文件路径在$QTDIR/lib里面~”。

第二句话QT += core就细分了,它告诉qmake,头文件路径可以向下一层,即$QTDIR/include/QtCore。链接需要的库呢,指定了一个QtCore4.lib。并定义宏QT_CORE_LIB

我们可以在QtCore文件夹里找到我们熟悉的QString,这就是我们在编写小程序用到QString却不需要#include<QString>的原因。


好,我们现在来理一下这个思路。QT += XXX 实际上是为我们指明了一个路径。如果我们没有在pro文件中添加 QT += network ,然后#include<QTcpSocket>出现什么情况?有个波浪线出来了吧,提示是,“QTcpSocket:没有这个文件或目录”。这就是因为在Qt在include目录下找不到名为QTcpSocket的文件或者目录。

那好说啊,我们这样#include<QNetwork/QTcpSocket>不就能找到了吗?是的,可以看到波浪线没了,说明这个头文件确实能被找到,但是别忘了QT += XXX还提供了我们在链接时需要用到的库。如果在单步编译这个Qt程序的话,可以看到编译过了,程序会在链接时报错。


你可能感兴趣的:(Qt pro pri 文件解析)