構(gòu)建體系
Windows平臺下構(gòu)建體系大致分三類:原生Visual C++梢夯、MinGW溜徙、Cygwin惊暴。下面詳細介紹著三種類型:
Visual C/C++
微軟的原生C/C++編譯器實現(xiàn)黄绩,支持標(biāo)準(zhǔn)C和C++谣沸,當(dāng)然在標(biāo)準(zhǔn)C和C++基礎(chǔ)上有大量擴展。另外人乓,宇宙第一IDEVisual Studio
提供了編輯勤篮、編譯、調(diào)試一體的解決方案色罚,更是給編碼提供了很多的效率提升碰缔。隨著微軟.NET
戰(zhàn)略的實施,VS逐漸成為.NET開發(fā)者的必要開發(fā)工具戳护。
MinGW
MinGW
(Minimal GUN for Windows)是一款windows軟件金抡,旨在將GNU編譯工具鏈(gcc
,binutil
)移植到windows下,這樣可以在windows下使用gcc等工具構(gòu)建軟件腌且。
一般MinGW需要配合MSYS
來用梗肝。MSYS
是一個Shell的windows移植版本,附帶有一些常用的命令和工具铺董。這樣巫击,有了MSYS
,連configure
都可以用了精续。MSYS
實際上是下面要提到的Cygwin
的一個早期分支派生出來的坝锰。
MSYS2
是重寫了MSYS
,并引入了pacman
包管理工具重付。用MSYS2
可以比較方便的搭建MinGW開發(fā)環(huán)境顷级。
不過MinGW環(huán)境只是一系列編譯構(gòu)建工具的集合。對于在windows下開發(fā)程序确垫,仍然需要使用windows原生的api弓颈。換句話說拣凹,可以理解為用MinGW代替Visual C/C++。
Cygwin
Cygwin
在windows上實現(xiàn)了一層posix
層恨豁,以便基于posix的程序移植到windows。因此爬迟,基于Cygwin
橘蜜,可以獲得更多的linux程序,并在windows使用付呕。由于采用了中間層计福,因此運行效率相對原生的windows有些低,但是如果希望快速將linux程序移植到windows徽职,是一個不錯的選擇象颖。
Cygwin
也派生出了上面提到的MSYS
。
在發(fā)布基于Cygwin
的程序時姆钉,需要帶上cygwin1.dll
说订,作為依賴。
基于Cygwin
我們可以在windows上使用熟悉的git
vim
make
gcc
等軟件潮瓶,默認的終端可以讓我們繼續(xù)使用/
而不是\
作為路徑分隔符陶冷。
工具
-
Denpendency Walker
: 在linux下我們用ldd
來查看程序的依賴,在windows下毯辅,我們需要Denpendency Walker -
Dumpbin
: VS自帶的工具埂伦,用于查看庫的導(dǎo)入導(dǎo)出函數(shù) -
MSDN
:Man
是linux最重要的文檔參考工具,而在windows下思恐,MSDN是必備的 -
《Windows via C/C++》
:此書的地位相當(dāng)于APUE
-
VS Command Line Tool
:作為習(xí)慣了終端界面的linux程序員來說沾谜,可以更愿意使用編輯器+編譯器的模式,而并不喜歡使用vs的集成環(huán)境界面胀莹。那么我們需要找到VS附帶的Visual Studio命令行工具基跑,用管理員身份打開它。這個bat腳本會為我們設(shè)置必要的編譯環(huán)境變量嗜逻,然后在其中運行cl
涩僻,link
,nmake
等編譯構(gòu)建命令才能有作用栈顷。
運行庫和庫文件
windows中也有類似glibc
的C運行庫逆日,以支撐C/C++編寫的程序得以運行。他們是MSVCRTxxd.dll和MSVCRTxx.dll萄凤,xx是版本號室抽,筆者見過的有MSVCRT70.dll MSVCRT80.dll MSVCRT90.dll MSVCRT100.dll等,末尾的d
表示是debug版本的運行庫還是release版本的運行庫靡努。程序運行的時候究竟依賴哪個版本坪圾,取決于在編譯階段采用/MD
還是/MDd
編譯選項晓折。
在windows中庫文件分兩種:
- .obj:對象文件,相當(dāng)于
.o
兽泄。 - .dll:動態(tài)鏈接庫文件漓概,類似
.so
。程序在運行時才會加載和鏈接需要的dll病梢。windows的一個方便的地方是胃珍,dll只需要在你的exe文件所在目錄中即可。 - .lib:靜態(tài)庫文件蜓陌,類似
.a
觅彰。程序在編譯時如果選擇靜態(tài)鏈接,那么.lib會用上钮热。不過并不是所有的.lib都是靜態(tài)庫文件填抬,還有一些.lib比較小,是作為.dll的導(dǎo)入庫存隧期,沒有實際的二進制代碼飒责,只是一些符號表。也就是說如果你的程序依賴一個.dll仆潮,那么在編譯階段读拆,編譯器要找到.dll相應(yīng).lib導(dǎo)入庫才能完成鏈接。而在運行時鸵闪,只需要找到dll即可檐晕。
在windows中,可執(zhí)行文件采用PE格式封裝蚌讼,相應(yīng)的辟灰,linux中采用ELF。
編寫或使用動態(tài)鏈接庫需要注意函數(shù)聲明方式篡石。VC編譯器有一組特殊的聲明:__declspec(dllexport)
和__declspec(dllimport)
分別用于在dll中聲明為導(dǎo)出函數(shù)芥喇,和在使用dll時聲明為dll導(dǎo)入函數(shù)。這種聲明會將函數(shù)名字添加__impl_
前綴凰萨,因此如果不能配對使用的話继控,往往容易出現(xiàn)鏈接錯誤。
此外胖眷,__stdcall
和__cdecl
影響函數(shù)的入?yún)㈨樞颉?/p>