wordpress 登陸后訪(fǎng)問(wèn)棗莊網(wǎng)絡(luò)推廣seo
IDE編程環(huán)境配置
LIB,DLL區(qū)別
我們?cè)趯?xiě)項(xiàng)目時(shí)會(huì)鏈接(調(diào)用)第3方庫(kù),或者比如在vs的解決方案solution創(chuàng)建項(xiàng)目project時(shí),不僅可以開(kāi)發(fā)可執(zhí)行程序exe(可單獨(dú)運(yùn)行)(windows/控制臺(tái) 應(yīng)用程序),也可以開(kāi)發(fā)自定義庫(kù)(不可單獨(dú)運(yùn)行,只能在應(yīng)用程序被調(diào)用)(DLL動(dòng)態(tài)庫(kù),LIB靜態(tài)庫(kù))
庫(kù)是一個(gè)二進(jìn)制文件,包含了源文件中(.cpp
?或?.c)
,頭文件相反,頭文件僅包含聲明信息
靜態(tài)庫(kù)(.lib靜態(tài)庫(kù)文件)
靜態(tài)庫(kù)存儲(chǔ)了實(shí)際的數(shù)據(jù)和函數(shù)
當(dāng)編譯器鏈接庫(kù)時(shí),會(huì)從庫(kù)中復(fù)制這些函數(shù),并和我們的應(yīng)用程序一起組合為exe可執(zhí)行文件,最終的可執(zhí)行文件exe會(huì)比較大
發(fā)布時(shí)僅發(fā)布這個(gè)可執(zhí)行文件就行
靜態(tài)鏈接庫(kù)中不能再包含其他的動(dòng)態(tài)鏈接庫(kù)或者靜態(tài)庫(kù)
動(dòng)態(tài)庫(kù)(.dll動(dòng)態(tài)庫(kù)文件)輔助文件:(lib引入庫(kù)/導(dǎo)入庫(kù)文件)
引入庫(kù)文件(.LIB)包含DLL導(dǎo)出的函數(shù)和變量的符號(hào)名,而.DLL文件包含該DLL實(shí)際的函數(shù)和數(shù)據(jù)
編譯時(shí)僅需要鏈接LIB引入庫(kù)文件,DLL中的函數(shù)代碼和數(shù)據(jù)并不可復(fù)制到可執(zhí)行文件
運(yùn)行時(shí),會(huì)根據(jù)LIB的地址符號(hào)表,從DLL庫(kù)查找導(dǎo)出的函數(shù)
發(fā)布時(shí)不僅要發(fā)布這個(gè)可執(zhí)行文件,也要發(fā)布DLL動(dòng)態(tài)庫(kù)文件
動(dòng)態(tài)鏈接庫(kù)中還可以再包含其他的動(dòng)態(tài)或靜態(tài)鏈接 庫(kù)
優(yōu)點(diǎn):
內(nèi)存優(yōu)化:只有exe調(diào)用了函數(shù)時(shí),才會(huì)被加載到內(nèi)存中,從而可以減少exe文件的大小
代碼共享/模塊化/跨平臺(tái)兼容性/插件支持:因?yàn)椴⒎窍耢o態(tài)庫(kù)一樣被復(fù)制到exe中,而是調(diào)用了什么什么就被加載,因此有較高的靈活性
LIB,DLL庫(kù)配置
DLL
使用時(shí)只能使用dll中導(dǎo)出的函數(shù),未導(dǎo)出的函數(shù)只能在dll內(nèi)部使用
隱式連接
需要三個(gè)文件
*.h頭文件
需要include 包含導(dǎo)出函數(shù)的頭文件
- 可以直接寫(xiě)絕對(duì)路徑
- 可以拷貝到src源碼目錄下
- 也可以配置項(xiàng)目屬性,VC++目錄->包含目錄,或者,C/C++->常規(guī)->附加包含目錄
lib引入庫(kù)
- 可以添加到項(xiàng)目project中,確保選中目標(biāo)項(xiàng)目,選中要添加的庫(kù):”添加”–>”現(xiàn)有項(xiàng)”–>選擇lib文件
- 可以配置項(xiàng)目屬性,鏈接器->常規(guī)->附加庫(kù)目錄,然后,鏈接器->輸入->附加依賴(lài)項(xiàng)(庫(kù)名)
DLL庫(kù)
- 直接拷貝,將dll拷貝到運(yùn)行時(shí)目錄,與調(diào)用者exe文件在同一目錄
- 可以配置項(xiàng)目屬性,VC++目錄->可執(zhí)行目錄,并且,調(diào)試 ->工作目錄
LIB
*.h頭文件
.lib靜態(tài)庫(kù)
……和上述一樣
DLL庫(kù)使用
我們要手動(dòng)控制dll中函數(shù)哪些被導(dǎo)出,哪些僅在內(nèi)部使用,
并且是被導(dǎo)出還是導(dǎo)入,在生成dll的時(shí)候我們希望導(dǎo)出,在使用dll時(shí)則時(shí)希望導(dǎo)入符號(hào)
__declspec關(guān)鍵字可以作用于,類(lèi),函數(shù),變量
_declspec(dllimport) 導(dǎo)入
?__declspec(dllexport)導(dǎo)出
使用時(shí)通常通過(guò)宏,如果項(xiàng)目定義了DLLEXPORT導(dǎo)出宏,那么宏_DLL_DECLARE_ 即為導(dǎo)出
否則_DLL_DECLARE_為導(dǎo)入
#ifdef DLLEXPORT
#define _DLL_DECLARE_ declspec(dllexport)
#else
#define _DLL_DECLARE_ declspec(dllimport)
名詞
編譯器:可以完成從預(yù)編譯編譯,匯編,鏈接整個(gè)過(guò)程,將高級(jí)編程語(yǔ)言(如C、C++、Java等)編寫(xiě)的源代碼轉(zhuǎn)換為機(jī)器語(yǔ)言,使得高級(jí)語(yǔ)言編寫(xiě)的文件能夠被計(jì)算機(jī)執(zhí)行
- 編譯器執(zhí)行過(guò)程:
- 預(yù)編譯(Preprocessing)
- 使用g++的
-E
選項(xiàng)將hello.cpp
和包含的頭文件預(yù)編譯為hello.i
- 編譯(Compilation)
- 使用
g++
的-S
選項(xiàng)將hello.i
編譯為匯編代碼文件hello.s
- 匯編(Assembly)
- 使用
g++
的-c
選項(xiàng)將hello.s
匯編為目標(biāo)文件hello.o(
翻譯為機(jī)器指令) - 鏈接(Linking)
- 使用
g++
將hello.o
鏈接為可執(zhí)行文件hello.exe
g++ main.cpp -o main
IDE(Integrated Development Environment)集成開(kāi)發(fā)環(huán)境:它集成了代碼編輯器、編譯器、調(diào)試器、圖形用戶(hù)界面工具等多種功能,使得開(kāi)發(fā)者可以在一個(gè)統(tǒng)一的界面中完成代碼編寫(xiě)、編譯(例如vs中的build構(gòu)建)、調(diào)試、運(yùn)行等所有開(kāi)發(fā)任務(wù)。
GNU:操作系統(tǒng),包含GCC(編譯器),Linux內(nèi)核,和其他的GNU工具集(Emacs編輯器,GDB調(diào)試器等)
GCC(GNU Compiler Collection,GNU編譯器集合)編譯器:支持多種編程語(yǔ)言(如C、C++、Objective-C、Fortran等)和多種計(jì)算機(jī)體系結(jié)構(gòu)(如x86、ARM等)GCC/G++編譯器:GCC專(zhuān)門(mén)編譯C語(yǔ)言,G++專(zhuān)門(mén)編譯C++語(yǔ)言
MSVC(Microsoft Visual C++)編譯器:微軟公司開(kāi)發(fā)專(zhuān)有的C++編譯器,提供了豐富的庫(kù)和工具來(lái)支持Windows平臺(tái)的應(yīng)用程序開(kāi)發(fā),被Visual Studio IDE所集成
MinGW(Minimalist GNU?for Windows)編譯器:包括GCC編譯器和適用于Windows的頭文件和庫(kù),開(kāi)源,跨平臺(tái)性
運(yùn)行時(shí)庫(kù):支持程序運(yùn)行的基本函數(shù)的集合,一般是靜態(tài)庫(kù)lib或動(dòng)態(tài)庫(kù)dll。
SDK:軟件開(kāi)發(fā)工具包
構(gòu)建工具:
對(duì)于大型項(xiàng)目,手動(dòng)列出所有源文件編譯,可能會(huì)變得繁瑣且容易出錯(cuò),為了防止每次編譯都要執(zhí)行大量的命令,我們使用構(gòu)建工具,
負(fù)責(zé)整個(gè)項(xiàng)目的構(gòu)建過(guò)程,包括調(diào)用編譯器、鏈接器、測(cè)試框架等,它們通常會(huì)讀取項(xiàng)目配置文件(如Makefile、CMakeLists.txt、Premake腳本等),這些文件定義了項(xiàng)目的結(jié)構(gòu)、依賴(lài)關(guān)系、構(gòu)建步驟等,然后調(diào)用系統(tǒng)編譯器進(jìn)行項(xiàng)目構(gòu)建
這樣只用使用make等命令,就可以編譯鏈接項(xiàng)目配置文件里配置的文件了
make構(gòu)建工具:適合簡(jiǎn)單的、不需要跨平臺(tái)的項(xiàng)目構(gòu)建,
Cmake構(gòu)建工具:跨平臺(tái),自定義語(yǔ)言,適合需要跨平臺(tái)支持的大型項(xiàng)目,提供了豐富的功能和更好的可維護(hù)性。
Premake構(gòu)建工具,跨平臺(tái),lua語(yǔ)言,提供了高度的靈活性和可擴(kuò)展性,適用于各種規(guī)模和復(fù)雜度的項(xiàng)目。
在Window通過(guò)命令行使用MSVC編譯C++項(xiàng)目
編譯:
在window系統(tǒng)中,包含MinGW和MSVC編譯器,如果想要使用MSVC,首先應(yīng)下載(Visual Studio Installer,再選擇單個(gè)組件(MSVC和SDK)安裝)
然后配置Path環(huán)境變量,這樣我們就可以使用MSVC編譯器了
這時(shí)使用cl main.cpp(文件名),命令,就可以編譯為exe文件了
運(yùn)行:
通過(guò)執(zhí)行main.exe就可以運(yùn)行了