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等效果一样),前者则不会定义这个宏。

  • 相关阅读:
    jsp mysql 配置线程池
    服务端 模拟 检测 攻击。。乱写
    硕思闪客精灵 7.2 破解版
    unity UnityAwe 插件
    smartfoxserver 2x 解决 Math NAN
    unity 断点下载
    java 监听文件目录修改
    wind7 64 setup appjs
    sfs2x 修改jvm 内存
    unity ngui 解决图层问题
  • 原文地址:https://www.cnblogs.com/hnrainll/p/2052335.html
Copyright © 2011-2022 走看看