QT5 中的.pro 文件中為何要加入QT += widgets,而不能在包頭文件的時候就包一個widgets/QApplication呢?
Linux 菜鳥,這裡說一下我個人的疑惑,還望各位解答,謝謝!
首先我理解的 +=widgets 即為包含該模塊。但是我不理解的是這一行為除了告訴頭文件可以在widgets文件夾里查找以外 還有什麼功能。
所以我以我的理解直接在包頭文件的時候加上了widgets文件夾,結果鏈接的時候報錯。但庫文件不是都放在同一個位置么?為什麼在鏈接的時候會找不到定義的類和函數呢?我對鏈接的了解可能還太膚淺,網上查閱一番也沒能很好的理解。
在pro里 寫 qt+=widgets 表示引入 QtWidget這個module,qmake會在幫你生成makefile的時候,設置好include path 和 lib path,在link時候設置好libs。
而僅在源代碼里 include &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&
(這一條可能你自己工程里沒有報錯,是因為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發行版更新地那麼頻繁?