編程涉及的術語和名詞

http://c.biancheng.net/view/3871.htmlhtml

 

本節咱們來介紹一下使用 Qt 編程過程當中經常使用的術語和名字,它們不必定專屬於 Qt,在其它的 C/C++ 開發過程當中也會使用到。linux

Project

Project 的中文翻譯是「項目」或者「工程」,這裏的項目是指爲實現某個相對獨立功能的程序代碼合集,這些代碼不僅僅是放在一塊,而是有相互之間的關聯性,而且有專門負責管理該項目的項目文件,好比:c++

  • Qt 使用 .pro 文件管理項目;
  • VC++ 則使用 .vcproj 做爲項目文件。


集成開發環境一般都是依據項目文件(.pro/.vcproj)管理和構建項目。程序員

Makefile

即生成腳本,雖然能夠直接調用編譯器如 g++ 編譯程序,可是若是項目裏的代碼文件變多了,哪些代碼文件更新了須要從新編譯,哪些代碼沒有改不須要從新編譯等等,靠程序員本身記憶去處理是比較麻煩的事,還有哪些代碼須要預處理或是連接哪些庫文件, 這些都是繁雜的過程。爲了規範程序的編譯生成過程,產生了規範化的生成腳本,就是 Makefile,生成器 make 能夠依據規範的 Makefile 自動生成目標程序或庫文件。

簡單的說,就是定義好 Makefile ,讓程序員只須要去關注如何編寫代碼,而生成程序過程當中的髒活累活都交給 make 程序。

如今 Makefile 一般都有工具自動生成,如 qmake 工具, 這樣就大量減輕了程序員的負擔。編程

Debug 和 Release

Debug 即調試,Release 即發行。代碼編寫以後,生成的目標程序或庫文件一般不會絕對正確,或多或少有些毛病(bug), 所以須要進行糾錯調試(Debug)。調試過程當中須要源代碼和二進制目標程序之間一一對應的關係, 這樣才能定位到錯誤代碼,因此 Debug 版本的程序是臃腫而不進行優化的。

與之相對的是 Release 發行版,在糾正了發覺到的錯誤後,須要發佈程序用於實際用途,實際應用時強調運行效率高,減小冗餘代碼,所以會對二進制程序進行大量優化,提高性能。這樣發佈的二進制目標程序就是 Release 版。

Debug 版本和 Release 版本使用的庫文件不同:函數

  • Debug 版本程序一般連接的也是 Debug 版本的庫文件,好比 libQt5Guid.a/Qt5Guid.dll,庫文件的簡短名(不含擴展名)都是以 d 結尾的,Debug 庫一般都比較大 。
  • Release 版本程序連接的一般就是 Release 版本的庫文件,Release 版本庫文件名字比 Debug 版本庫文件少一個字母 d ,如 libQt5Gui.a/Qt5Gui.dll,並且 Release 版本庫通常都比 Debug 版本小不少,運行效率也高不少。

C++11 標準

時代在變化,C++ 標準也在前進。C++ 正式公佈標準有 C++9八、C++0三、C++11。最新的 C++11 標準是2011年8月12日公佈的,在公佈以前該標準原名爲 C++0x 。這是一次較大的修訂和擴充,建議讀者專門學一下。

Qt 從 4.8 版本就開始用 C++11 新特性了。編譯器裏面開始支持 C++11 的版本是 MSVC 20十、GCC 4.五、Clang 3.1,這以後版本的編譯器都在逐步完善對 C++11 的支持,如今新版本編譯器對新標準的支持都比較全面了。

Qt 官方在編譯 Qt5 庫的時候都是開啓 C++11 特性的,若是咱們要在本身項目代碼啓用新標準,須要在 .pro 文件裏面添加一行:工具

CONFIG += c++11性能

若是是 Qt4 版本則是添加:優化

gcc:CXXFLAGS += -std=c++0xui

MSVC 編譯器默認開啓 C++11 特性,GCC(g++命令)則須要本身添加選項 -std=c++0x ,上面 CXXFLAGS 就是爲 GCC 編譯器(g++命令)添加 -std=c++0x 選項。

Dynamic Link 和 Static Link

Dynamic Link 即動態連接,Static Link 即靜態連接。

動態連接庫

目標程序一般都不是獨立個體,生成程序時都須要連接其餘的庫,要用到其餘庫的代碼。對於多個程序同時運行而言,內存中就可能有同一個庫的多個副本,佔用了太多內存而乾的活差很少。

爲了優化內存運用效率,引入了動態連接庫(Dynamic Link Library),或叫共享庫(Shared Object)。使用動態連接庫時,內存中只須要一份該庫文件,其餘程序要使用該庫文件時,只要連接過來就好了。因爲動態庫文件外置,連接到動態庫的目標程序相對比較小,由於剝離了大量庫代碼,而只須要一些連接指針。

使用動態庫,也意味着程序須要連接到如 *.dll 或 *.so 文件,得提早裝好動態庫文件,而後目標程序才能正常運行。

靜態連接庫

靜態庫就是將連接庫的代碼和本身編寫的代碼都編譯連接到一塊,連接到靜態庫的程序一般比較大,但好處是運行時依賴的庫文件不多,由於目標程序本身內部集成了不少庫代碼。

庫文件後綴

Linux/Unix 系統裏靜態庫擴展名通常是 .a,動態庫擴展名通常是 .so 。Windows 系統裏 VC 編譯器用的靜態庫擴展名通常是 .lib,動態庫擴展名通常是 .dll 。

MinGW 比較特殊,是將 GNU 工具集和連接庫從 Linux/Unix 系統移植到 Windows 裏, 有意思的狀況就出現了,MinGW 使用的靜態庫擴展名爲 .a ,而其動態庫擴展名則爲 .dll, .a 僅在生成目標程序過程當中使用,.dll 則是在目標程序運行時使用。

Explicit Linking 和 Implicit Linking

Explicit Linking 即顯式連接,Implicit Linking 即隱式連接,這兩種都是動態連接庫的使用方式。

動態連接庫一般都有其導出函數列表, 告知其餘可執行程序可使用它的哪些函數。可執行程序使用這些導出函數有兩種方式:一是在運行時使用主動加載動態庫的函數,Linux 裏好比用 dlopen 函數打開並加載動態庫,Windows 裏通常用 LoadLibrary 打開並加載動態庫,只有當程序代碼執行到這些函數時,其參數裏的動態庫纔會被加載,這就是顯式連接。顯式連接方式是在運行時加載動態庫,其程序啓動時並不檢查這些動態庫是否存在。

隱式連接是最爲常見的,全部的編譯環境默認都是採用隱式連接的方式使用動態庫。隱式連接會在連接生成可執行程序時就確立依賴關係,在該程序啓動時,操做系統自動會檢查它依賴的動態庫,並一一加載到該程序的內存空間,程序員就不須要操心何時加載動態庫了。好比 VC 編譯環境,連接時使用動態庫對應的 .lib 文件(包含動態庫的導出函數聲明,但沒有實際功能代碼),在 .exe 程序運行前系統會檢查依賴的 .dll,若是找不到某個動態庫就會出現相似下圖對話框:

找不到動態連接庫

MinGW 是將動態庫的導出函數聲明放在了 .a 文件裏,程序運行依賴的動態庫也是 .dll 。 請注意,VC 連接器使用的 .lib 文件分兩類,一種是完整的靜態庫,體積比較大,另外一種是動態庫的導出聲明,體積比較小。MinGW 連接器使用的 .a 文件也是相似的,Qt 官方庫都是按照動態庫發佈的,靜態庫只有本身編譯纔會有。

相關文章
相關標籤/搜索