日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

qmake 之 CONFIG 与 QT 乱谈

發布時間:2025/3/21 c/c++ 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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等效果一樣),前者則不會定義這個宏。

轉載于:https://www.cnblogs.com/hnrainll/archive/2011/05/20/2052335.html

總結

以上是生活随笔為你收集整理的qmake 之 CONFIG 与 QT 乱谈的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。