QT5 中的.pro 文件中為何要加入QT += widgets,而不能在包頭文件的時候就包一個widgets/QApplication呢?

Linux 菜鳥,這裡說一下我個人的疑惑,還望各位解答,謝謝!

首先我理解的 +=widgets 即為包含該模塊。

但是我不理解的是這一行為除了告訴頭文件可以在widgets文件夾里查找以外 還有什麼功能。

所以我以我的理解直接在包頭文件的時候加上了widgets文件夾,結果鏈接的時候報錯。

但庫文件不是都放在同一個位置么?為什麼在鏈接的時候會找不到定義的類和函數呢?

我對鏈接的了解可能還太膚淺,網上查閱一番也沒能很好的理解。


在pro里 寫 qt+=widgets 表示引入 QtWidget這個module,qmake會在幫你生成makefile的時候,設置好include path 和 lib path,在link時候設置好libs。

而僅在源代碼里 include &僅是引入聲明,但是沒有lib,所以鏈接時會出錯。

當然,我們可以批評C++這種源自上世紀70年代的頭文件和lib分離的設計是過時的不合理的,現代語言基本都採用package管理,用import解決了。

但是我們既然還在用C++,就要接受這種設計,把它搞明白。

另外你說在網上找不到資料,我大膽猜測你是用baidu搜索的,因為用google搜索,這類資料是很多的,比如

The compiler, assembler, linker, loader and process address space tutorial

圖文並茂地講述了編譯器 鏈接器和載入器的工作原理。


寫這個就省得你import lib了。

當然vs里你也可以不寫,但是Project-&>Settings-&>Link要寫好。


就是路徑問題,只不過你只說了頭文件路徑,忘了庫文件路徑

QT += widgets包括兩部分:

1,Lib。

這個是lib的路徑和lib文件的文件名。

2,include。

*.h的路徑在pro文件里設置,.h的文件名用代碼里的#include設定

QT += widgets 貌似可以分開寫成(記憶不太準確,大致是這樣):

INCLUDE+= 一串路徑 (因為文件名都在代碼里以include形式出現,所以這裡沒必要出現文件名)

LIB+=一串路徑 + -l文件名 + -l文件名。。。。

你的做法問題在於:

1,除了頭文件之外還有鏈接庫文件啊,windows上是*.lib。

它的路徑沒有設置當然會出現鏈接錯誤。

2,如果#include像這樣寫#include&<./aaa/bbb/cccc.h&>

(假設cccc.h是系統的頭文件 也可能是cccc沒有.h,和頭文件的文件名命名有關,這裡假設是cccc.h)

那麼cccc.h這個文件的包含沒有問題。但是cccc.h文件里包含的其他文件呢?因為在cccc.h的代碼里都是類似#include& #include&這種的代碼,因為你沒設置include路徑所以沒辦法找到dddd文件和eeee文件。當然如果你可以把cccc的代碼全部改掉加上路徑,然後把eeee,dddd代碼和其所有包含的文件相應的include語句全部改掉,那麼這一條也沒有問題,但是工作量大到天上去了,不現實。

(這一條可能你自己工程里沒有報錯,是因為Qt庫的編程風格,Qt把所有庫的實現全封裝到一個private類里了,這個類的實現放在cpp文件里隱藏起來了,所以接著上面的例子說如果cccc.h是按照Qt的風格來的話,那cccc.h里很可能幾乎沒有include其他任何文件,Qt把所有的include全部轉移到cpp文件里了,cpp文件其實就是*.lib文件和動態庫)

3,庫文件路徑不一定放在一個地方,Qt是在Qt安裝目錄,C++庫文件在你編譯環境的安裝目錄,你自己編寫的庫文件隨你心意想放哪放哪。所以你說庫文件在一個地方這句話是錯的。


我倒覺得h和lib分離有時還是挺好的。


推薦閱讀:

linux下如何刪除文件夾而不刪除文件夾里的內容?
fork如何實現執行一次返回兩個值的?
YunOS 與 Android 有什麼關係?
如何理解「In UNIX, everything is a file」?
為什麼有些Linux發行版更新地那麼頻繁?

TAG:編程語言 | Linux | QtC開發框架 | C |