2011-10-11 114 views
0

我在Visual Studio中創建了lib。 Lib有兩個模塊:A.cpp和B.cpp。 在單獨的項目中,我鏈接到這個庫,但我想禁用此lib的模塊之一,即B.cpp。從鏈接中刪除庫的模塊

+0

這個問題有點難以遵循。如果將'A.cpp'和'B.cpp'編譯爲一個靜態庫,則不僅可以鏈接該庫的一部分。如果是這樣的話,你需要實現兩個靜態庫,每個模塊一個。 – Chad

回答

1

你可能不需要拆分你的lib。

只有當您的可執行文件(exe/dll)還有未解析的符號時,纔會鏈接lib的必需內容。 不必要的內容一般地講不掛

例如:

假設你的lib目錄包含有2 OBJ-文件,A.OBJa.cppB.OBJb .cpp。等等

a.cpp包含調用函數void b(int j).

b.cpp包含函數void b(int j)功能void a(int i)

並假設你的可執行文件中的源文件,一個包含一個函數

void b(int k)

的執行情況和其他一些一段代碼,你必須void a(int)通話。

當您鏈接到lib時,鏈接器在一個階段留下1個未解析的符號(即調用函數void a(int))。它將搜索您爲第一次出現此類函數簽名而指定的庫,以及因爲你的可執行代碼已經包含執行void b(int)它不需要搜索任何庫來解決它在a.obj中的調用,所以b.obj不會被鏈接。

總結(非常簡化):

只要你不直接或間接地調用\使用b.obj中的任何東西,它將不會被鏈接(除非在鏈接cmd中指定一個lib爲OBJ = YourLib.lib,這會引入整個庫)。

如果您直接或間接調用b.obj中實現的東西,並在可執行文件中實現這些符號(函數或全局變量),那麼b.obj的這些部分將不會鏈接到功能級鏈接指定),否則如果您忘記了某些內容,將會出現重複的符號鏈接錯誤。

0

將項目拆分爲兩部分,其中一部分包含A.cpp,另一部分包含B.cpp。然後,如果您需要鏈接到兩個.cpp文件,則必須鏈接到兩個.lib文件。但是如果你想鏈接到一個,那麼你可以這樣做。