zoukankan      html  css  js  c++  java
  • qmake 之 CONFIG 与 QT 乱谈

    转自:http://hi.baidu.com/cyclone/blog/item/d299af511bed309f8c5430c3.html

    看qtcn论坛中经常有人忘记 QT+=network 等语句。随便写写吧,或许对他人有帮助。

    写来写去,发现越写越乱,就这样吧,反正主要的内容很简单。 dbzhang800 20101116

    从哪儿开始呢?

    不妨先看个例子吧:

    #include <QtCore/QCoreApplication>
    #include <QtCore/QDebug>
    int main(int argc, char** argv)
    {
    QCoreApplication app(argc, argv);
    qDebug()<<"hello qt!";
    app.exec();
    }

    如何编译这个程序呢?我们知道,构建一个C++程序:无非是编译(包括编译预处理)、链接 这几步。

    • 编译时,我们需要让预处理器能找到我们的头文件(即:指定头文件路径)
    • 链接时,我们需要让链接器能找到我们需要的库

    对这个程序来说呢,也就是,指定

    头文件路径

    $QTDIR/include

    库文件

    QtCore4.lib(或相应的其他形式)

    答案就简单了(分别采用g++和msvc进行编译):

    g++ main.cpp -Ie:\Qt\4.7.0\include -o main -Le:\Qt\4.7.0\lib -lQtCore4

    cl main.cpp -ID:/Qt/4.7.0/include -Femain  -link -LIBPATH:D:/Qt/4.7.0/lib QtCore4.lib

    参数的含义可参考:从 C++ 到 Qt

    头文件 库文件

    我们知道,在C++中,使用第三方库的过程,就是包含头文件、链接库文件的过程:

    使用QString

    需要 -lQtCore4

    使用QWidget

    需要 -lQtGui4

    使用QFtp

    需要 -lQtNetWork4

    使用QWebView

    需要 -lQtWebKit4

    ...

    ...

    我们接下来先简单看一下Qt的头文件和库文件,然后看看qmake是如何处理的:为什么我们不需要在.pro文件内指定这些头文件路径和库文件

    Qt头文件

    估计不少对C、C++不是那么熟的同仁,会对Qt中的下面各种写法感到迷惑(比如我们要用到 QString 的头文件):

    • #include<QString>

    • #include<QtCore/QString>

    • #include<string.h>

    • #include<QtCore/string.h>

    不过咱们都是学过C、C++的,都知道尖括号或双引号内就是一个头文件的文件名。所以理解起来应该没什么难度,转来转去无非是下面的几个文件:

    • $QTDIR/include/QtCore/QString

    • $QTDIR/include/QtCore/qstring.h

    所以呢?当你

    使用头文件

    需要指定头文件路径

    #include<QString>

    $QTDIR/include/QtCore

    #include<QtCore/QString>

    $QTDIR/include

    有些人喜欢用#include<QtCore>这种写法,这是头文件在哪儿呢?它的全路径是

    $QTDIR/include/QtCore/QtCore

    与此类似

    使用头文件

    需要指定头文件路径

    #include<QtCore>

    $QTDIR/include/QtCore

    #include<QtGui>

    $QTDIR/include/QtGui

    #include<QtScript>

    $QTDIR/include/QtScript

    ...

    ...

    不清楚你注意到没?如果你坚持使用 #include<QtCore/QString> 这种写法,你只需要一个头文件路径,这就是$QTDIR/include

    Qt库文件

    和头文件比起来,库文件似乎就比较简单了。因为它们直接在下面的路径下

    • $QTDIR/lib

    路径简单,可是库呢?

    • 动态库(共享库)、静态库(归档库)
    • 不同平台下有不同的后缀。 .dll, .so, .dylib, .lib, .a
    • 带调试信息,不带调试信息的库
    • windows下的动态库需要引导库

    以windows下MSVC编译的Qt4为例:

    • 静态编译
      • $QTDIR/lib/QtCore.lib

      • $QTDIR/lib/QtCored.lib

    • 动态编译
      • $QTDIR/lib/QtCore4.lib

      • $QTDIR/lib/QtCore4.dll

      • $QTDIR/lib/QtCored4.lib

      • $QTDIR/lib/QtCored4.dll

    qmake

    用qmake管理我们前面的例子的话,我们只需要写一个简单 .pro 文件

    CONFIG += console
    QT -= gui
    SOURCES += main.cpp

    这样一来,qmake是如何知道需要哪些头文件和库文件的呢?

    其实,这儿省略了两行代码(因为是默认值,所以可以不写,但对我们理解这个例子至关重要)

    CONFIG += qt 
    QT += core

    那么这些东西如何和前面的东西联系起来呢?

    首先

    CONFIG += qt

    将使得最终包含:

    • 头文件路径

      $QTDIR/include

      库文件路径

      $QTDIR/lib

    其次

    QT += core

    将对Qt相关的路径进一步细化

    • 头文件路径中

      $QTDIR/include/QtCore

      链接需要的库

      QtCore4.lib

      编译预处理的宏

      QT_CORE_LIB

    看,现在头文件路径和库文件都有了,而且,无论头文件写成 QString 还是 !QtCore/QString 都能被找到。

    再次,由于在 .pro 文件内

    • CONFIG 中默认包含 qt
    • QT 中默认包含 core

    这使得这点变得更加隐藏

    QT

    举个例子,如果我们在程序中用了

    #include <QFtp>
    ...
    QFtp xxx;
    ...

    那么我们将需要

    • 指定头文件路径

      $QTDIR/include/QtNetwork

      指定要链接的库

      QtNetWork4.lib

    这两个正是下面的语句所做的:

    QT += network
    • 除此,该语句还定义宏 QT_NETWORK_LIB

    哈哈哈,发现下面问题的答案了没:

    • 忘记了QT+=network这样的语句,为什么有的人遇到的编译错误,有的人遇到的是链接错误?

    • 因为没有头文件路径,编译时就会找不到头文件。(但如果写成 QtNetWork/QFtp ,则不会有这个问题。)
    • 因为没有指定链接库,即使头文件找到了,链接时也肯定会遇到问题的。(答案很明显吧)

    如何启用一个模块

    当启用一个模块时,我们

    • 要么是修改 CONFIG 变量
    • 要么是细化 QT 变量
    • 而有的模块,两者均可。

    修改QT

    这是最常规的,QtCore、QtGui、QtNetWork 等等

    • 使用Core模块

      QT += core

      使用Gui模块

      QT += gui

      使用NetWork模块

      QT+=network

    修改CONFIG

    比如 QAxContainer 模块

    CONFIG += qaxcontainer

    两者均可

    比如 QtTest 模块:

    我们可以使用

    CONFIG += qtestlib

    也可以使用

    QT += testlib

    两者的区别是,后者会定义 QT_TESTLIB_LIB 这样宏(同QT+= core gui等效果一样),前者则不会定义这个宏。

  • 相关阅读:
    使用Dynamics 365 Diagnostics 来检查网络链接
    Dynamics 365 使用power apps 创建 Auto Number
    Dynamics 365 多语言配置
    在AAD 注册 API permission
    python学习笔记20:序列
    python学习笔记19:集合set
    python学习笔记18:字典dict
    python学习笔记17:列表list
    python学习笔记16:正则表达式
    python学习笔记15:通过字符串导入模块
  • 原文地址:https://www.cnblogs.com/hnrainll/p/2052335.html
Copyright © 2011-2022 走看看