VC++多工程項目


1 VC++6.0    1

1.1 設置依賴關系    1

1.2 編譯順序    2

1.3 自動連接    3

1.4 靜態庫    3

1.4.1 嵌入    3

1.4.2 替換    4

2 VC++2005    6

2.1 設置依賴關系    6

2.2 自動連接    7

2.2.1 鏈接庫依賴項(Link Library Dependencies    8

2.2.2 忽略導入庫(Ignore Import Library    9

2.3 靜態庫    9

3 VC++2010    10

3.1 引用工程    10

 

1 VC++6.0

一個VC++6.0項目(Workspace),可以由多個工程(Project)構成。如下圖所示。此項目由AppMod1Mod2AMod2B四個工程組成。

1.1

1.1 設置依賴關系

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

1.2

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

單擊【Project】【Dependencies...】菜單項

1.3

顯示界面如下

1.4

上圖表示工程App依賴於Mod1Mod2AMod2B。可以更換AppMod1Mod2AMod2B,依次設置這些工程的依賴項。

1.2 編譯順序

設置了工程的依賴項,編譯時編譯器會自動編排編譯順序。編譯某個工程前,確保其依賴項已經被編譯。

如編譯圖1.2中的App時,編譯器會首先編譯好Mod1Mod2AMod2B;而編譯Mod2AMod2B之前,會首先編譯好Mod1。最終的編譯順序就是:Mod1Mod2AMod2BAppMod2AMod2B的編譯順序不是確定的,哪個先編譯都可以)。

1.3 自動連接

設置了工程的依賴項,編譯時編譯器會自動連接依賴項。如圖1.2中,連接App時,會自動連接Mod1.libMod2A.libMod2B.lib;連接Mod2A時,會自動連接Mod1.lib

1.4 靜態庫

要特別注意靜態庫的自動連接,否則編譯時可能會產生錯誤。

1.4.1 嵌入

可以把靜態庫看做obj文件的集合。

假如:Mod1是靜態庫工程,它有1.cpp2.cpp兩個源文件,編譯后生成的Mod1.lib,其結構為:

1.5

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

1.6

從上圖可以看到:Mod1.lib的內容被嵌入到Mod2A.lib

1.4.2 替換

假如:Mod2B是靜態庫工程,它有1.cpp2B.cpp兩個源文件。因為它自動連接Mod1.lib。因此生成的Mod2B.lib,其結構為:

1.7

對上圖的解釋:編譯Mod2B時,Mod2B.lib會包含兩個obj文件:2B.obj1.obj。連接Mod1.lib時,會再增加1.obj2.obj。此時,會有兩個1.obj。最終生成的Mod2B.lib只有三個obj文件,其中的1.objMod1.lib里的obj文件。也就是說:Mod2B里的1.obj被替換了。

以圖1.2為例,如果Mod1Mod2AMod2B均為靜態庫,則此三者之間無需設置依賴關系。在編譯App時,會自動連接Mod1.libMod2A.libMod2B.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.libMod2A.libMod2B.lib。如果不想讓App自動連接這些庫,可以設置App的"Link Library Dependencies"(鏈接庫依賴項)屬性為 No,如下面兩張圖所示:

 

2.5 英文版設置

2.6 中文版設置

2.2.2 忽略導入庫(Ignore Import Library

假如Mod1是動態庫,則編譯Mod2AMod2BApp時,均會自動連接Mod1的導入庫Mod1.lib。如果設置Mod1Ignore Import Library屬性為Yes,則編譯Mod2AMod2BApp時,將不再自動連接導入庫Mod1.lib

Ignore Import Library(忽略導入庫)的設置如圖2.5和圖2.6所示。

2.3 靜態庫

假如Mod1Mod2AMod2B均為靜態庫,則編譯Mod2AMod2B時,默認情況下VC++2005將不會再嵌入Mod1.libMod2A.libMod2B.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里設置AppLink Library DependenciesTrue則連接App時將自動連接Mod1.libMod2A.libMod2B.lib。反之,則不會自動連接Mod1.libMod2A.libMod2B.lib。簡單的說就是:要么全部自動連接,要么全不自動連接。

VC++2010App引用了幾個工程就需要設置幾次Link Library Dependencies。如:設置引用工程Mod1Link Library DependenciesTrue,則連接App時會自動連接Mod1.lib。反之,則不會自動連接Mod1.lib

VC++2010VC++2005的設置更加精准,但是設置的工作量也隨之加大。

設置工程之間的引用關系后,工程之間的依賴關系將被自動生成。如下圖所示:

3.3

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM