目錄
2.2.1 鏈接庫依賴項(Link Library Dependencies) 8
2.2.2 忽略導入庫(Ignore Import Library) 9
第1章 VC++6.0
一個VC++6.0項目(Workspace),可以由多個工程(Project)構成。如下圖所示。此項目由App、Mod1、Mod2A、Mod2B四個工程組成。

圖1.1
1.1 設置依賴關系
假定上圖四個工程的依賴關系圖如下所示。

圖1.2
上圖表示:Mod2A會調用Mod1里的某些函數,即Mod2A依賴於Mod1。總共有5個依賴關系。可以在VC++6.0里設置工程依賴關系,其操作如下:
單擊【Project】【Dependencies...】菜單項

圖1.3
顯示界面如下

圖1.4
上圖表示工程App依賴於Mod1、Mod2A、Mod2B。可以更換App為Mod1、Mod2A、Mod2B,依次設置這些工程的依賴項。
1.2 編譯順序
設置了工程的依賴項,編譯時編譯器會自動編排編譯順序。編譯某個工程前,確保其依賴項已經被編譯。
如編譯圖1.2中的App時,編譯器會首先編譯好Mod1、Mod2A、Mod2B;而編譯Mod2A或Mod2B之前,會首先編譯好Mod1。最終的編譯順序就是:Mod1、Mod2A、Mod2B、App(Mod2A和Mod2B的編譯順序不是確定的,哪個先編譯都可以)。
1.3 自動連接
設置了工程的依賴項,編譯時編譯器會自動連接依賴項。如圖1.2中,連接App時,會自動連接Mod1.lib、Mod2A.lib、Mod2B.lib;連接Mod2A時,會自動連接Mod1.lib。
1.4 靜態庫
要特別注意靜態庫的自動連接,否則編譯時可能會產生錯誤。
1.4.1 嵌入
可以把靜態庫看做obj文件的集合。
假如:Mod1是靜態庫工程,它有1.cpp、2.cpp兩個源文件,編譯后生成的Mod1.lib,其結構為:

圖1.5
假如:Mod2A是靜態庫工程,它有2A1.cpp、2A2.cpp兩個源文件。因為它自動連接Mod1.lib。因此生成的Mod2A.lib,其結構為:

圖1.6
從上圖可以看到:Mod1.lib的內容被嵌入到Mod2A.lib。
1.4.2 替換
假如:Mod2B是靜態庫工程,它有1.cpp、2B.cpp兩個源文件。因為它自動連接Mod1.lib。因此生成的Mod2B.lib,其結構為:

圖1.7
對上圖的解釋:編譯Mod2B時,Mod2B.lib會包含兩個obj文件:2B.obj和1.obj。連接Mod1.lib時,會再增加1.obj和2.obj。此時,會有兩個1.obj。最終生成的Mod2B.lib只有三個obj文件,其中的1.obj是Mod1.lib里的obj文件。也就是說:Mod2B里的1.obj被替換了。
以圖1.2為例,如果Mod1、Mod2A、Mod2B均為靜態庫,則此三者之間無需設置依賴關系。在編譯App時,會自動連接Mod1.lib、Mod2A.lib、Mod2B.lib。
第2章 VC++2005
一個解決方案(Solution),可以由多個工程(Project)構成。如下圖所示。

圖2.1
2.1 設置依賴關系
英文版請單擊【Project】【Dependencies...】菜單項,如下圖所示:

圖2.2 英文版
中文版請單擊【項目】【項目依賴項】菜單項,如下圖所示:

圖2.3 中文版
顯示界面如下。可在該界面下設置工程之間的依賴關系,其操作方法與VC++6.0的操作方法類似。

圖2.4
2.2 自動連接
設置了工程依賴項后,編譯時編譯器會自動編排編譯順序,也會自動連接依賴項。比VC++6.0更加先進的是:VC++2005能夠對自動連接依賴項進行控制。
2.2.1 鏈接庫依賴項(Link Library Dependencies)
以圖1.2為例,編譯App時,會自動連接依賴項:Mod1.lib、Mod2A.lib、Mod2B.lib。如果不想讓App自動連接這些庫,可以設置App的"Link Library Dependencies"(鏈接庫依賴項)屬性為 No,如下面兩張圖所示:
圖2.5 英文版設置

圖2.6 中文版設置
2.2.2 忽略導入庫(Ignore Import Library)
假如Mod1是動態庫,則編譯Mod2A、Mod2B、App時,均會自動連接Mod1的導入庫Mod1.lib。如果設置Mod1的Ignore Import Library屬性為Yes,則編譯Mod2A、Mod2B、App時,將不再自動連接導入庫Mod1.lib。
Ignore Import Library(忽略導入庫)的設置如圖2.5和圖2.6所示。
2.3 靜態庫
假如Mod1、Mod2A、Mod2B均為靜態庫,則編譯Mod2A、Mod2B時,默認情況下VC++2005將不會再嵌入Mod1.lib至Mod2A.lib和Mod2B.lib。
如果需要把Mod1.lib嵌入到Mod2A.lib,則需修改Mod2A工程的Use Library Dependency Inputs(使用庫依賴項輸入)屬性,如圖2.5和圖2.6所示。
設置該項為Yes,則生成Mod2A.lib時,連接的不是Mod1.lib,而是生成Mod1.lib所需的obj文件。即直接連接Mod1工程的obj文件。相當於把Mod1.lib嵌入到Mod2A.lib。
設置該項為No,則生成Mod2A.lib時,連接的是Mod1.lib,但不會把Mod1.lib嵌入到Mod2A.lib。
第3章 VC++2010
3.1 引用工程
VC++2010也可以設置工程依賴項,但是它僅僅用來控制各個工程的編譯順序,不再自動連接依賴項。如果仍希望自動連接依賴項,請使用"引用工程"的功能。鼠標右鍵單擊某個工程,彈出菜單中單擊【References...】菜單項。

圖3.1
下圖中,單擊"Add New Reference..."按鈕,可以增加一個引用;單擊"Remove Reference"可以刪除選中的引用;每個被引用的工程將有Link Library Dependencies(鏈接庫依賴項)和Use Library Dependency Inputs(使用庫依賴項輸入)兩個重要的選項。

圖3.2
注意:VC++2010的設置更加精准。如:
VC++2005里設置App的Link Library Dependencies為True則連接App時將自動連接Mod1.lib、Mod2A.lib、Mod2B.lib。反之,則不會自動連接Mod1.lib、Mod2A.lib、Mod2B.lib。簡單的說就是:要么全部自動連接,要么全不自動連接。
VC++2010里App引用了幾個工程就需要設置幾次Link Library Dependencies。如:設置引用工程Mod1的Link Library Dependencies為True,則連接App時會自動連接Mod1.lib。反之,則不會自動連接Mod1.lib。
VC++2010比VC++2005的設置更加精准,但是設置的工作量也隨之加大。
設置工程之間的引用關系后,工程之間的依賴關系將被自動生成。如下圖所示:

圖3.3
注意:如果App引用了Mod1,則Mod1前的復選框將被勾中且無法改變其狀態。也就是說一旦App引用了Mod1,那么App必定依賴於Mod1,這是無法修改的。
