關於工程標頭檔案的處理

2021-07-27 04:37:21 字數 2447 閱讀 7587

不妨先看個例子吧:

#

include /

#include /

qdebug>

intmain(int

argc, char** argv)

如何編譯這個程式呢?我們知道,構建乙個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檔案內指定這些標頭檔案路徑和庫檔案

估計不少對c、c++不是那麼熟的同仁,會對qt中的下面各種寫法感到迷惑(比如我們要用到 qstring 的標頭檔案):

不過咱們都是學過c、c++的,都知道尖括號或雙引號內就是乙個標頭檔案的檔名。所以理解起來應該沒什麼難度,轉來轉去無非是下面的幾個檔案:

所以呢?當你

使用標頭檔案

需要指定標頭檔案路徑

#include

$qtdir/include/qtcore

#include

$qtdir/include

有些人喜歡用#include這種寫法,這是標頭檔案在哪兒呢?它的全路徑是

$qtdir/include/qtcore/qtcore
與此類似

使用標頭檔案

需要指定標頭檔案路徑

#include

$qtdir/include/qtcore

#include

$qtdir/include/qtgui

#include

$qtdir/include/qtscript

......

不清楚你注意到沒?如果你堅持使用 #include 這種寫法,你只需要乙個標頭檔案路徑,這就是$qtdir/include

和標頭檔案比起來,庫檔案似乎就比較簡單了。因為它們直接在下面的路徑下

路徑簡單,可是庫呢?

以windows下msvc編譯的qt4為例:

動態編譯

用qmake管理我們前面的例子的話,我們只需要寫乙個簡單 .pro 檔案

config += console

qt -= gui

sources += main.cpp

這樣一來,qmake是如何知道需要哪些標頭檔案和庫檔案的呢?

其實,這兒省略了兩行**(因為是預設值,所以可以不寫,但對我們理解這個例子至關重要)

config += qt 

qt += core

那麼這些東西如何和前面的東西聯絡起來呢?

首先

config += qt
將使得最終包含:

其次

qt += core
將對qt相關的路徑進一步細化

看,現在標頭檔案路徑和庫檔案都有了,而且,無論標頭檔案寫成 qstring 還是 !qtcore/qstring 都能被找到。

再次,由於在 .pro 檔案內

這使得這點變得更加隱藏

舉個例子,如果我們在程式中用了

#include 

...qftp ***;

...

那麼我們將需要

這兩個正是下面的語句所做的:

qt += network
哈哈哈,發現下面問題的答案了沒:

當啟用乙個模組時,我們

這是最常規的,qtcore、qtgui、qtnetwork 等等

比如 qaxcontainer 模組

config += qaxcontainer
比如 qttest 模組:

我們可以使用

config += qtestlib
也可以使用

qt += testlib
兩者的區別是,後者會定義 qt_testlib_lib 這樣巨集(同qt+= core gui等效果一樣),前者則不會定義這個巨集。

標頭檔案的處理

ifndef x define x endif 這是巨集定義的一種,它可以根據是否已經定義了乙個變數來進行分支選擇,一般用於除錯等等 ifndef x 先測試x是否被定義過 define x 如果沒有定義下面就定義x並執行下面的語句 endif 如果已經定義了則執行 endif後面的語句 條件指示符...

關於標頭檔案

自定義標頭檔案通常放在使用該標頭檔案的原始檔所在的目錄中,並使用 include myhead.h 來包含。標頭檔案是不編譯的,因為c語言編譯過程之前有個預編譯過程。在這個過程中用標頭檔案中的內容替換原始檔中 include 命令,所以在編譯器看來,沒有標頭檔案,只有原始檔。預編譯過程還包括條件編譯...

Eclipse C工程標頭檔案引入

我們在進行c c 的開發時,習慣把頭檔案放乙個資料夾比如include,原始檔放src,這樣在原始檔裡include你自己的標頭檔案會找不到標頭檔案,這是因為eclipse不會自己新增同乙個工程裡面的各資料夾路徑,所以自己寫的標頭檔案就在眼前,但就是找不到,解決辦法 點c 專案上右鍵,propert...