2016-04-23 65 views
0

我有一個MAIN.EXE和兩個庫(LIB1和LIB2):鏈接時有什麼辦法跳過未使用的庫嗎?

在MAIN.EXE:

extern void f3(); 

int main() { 
    f3(); 
} 

在lib1.cpp:

extern void f4(); 
void f2() { 
    f4(); 
} 

void f3() { 
} 

在lib2.cpp:

void f4() { 
} 

所以從理論上說,我只需要lib1內建立MAIN.EXE成功,因爲只有f3()main()調用。

但是我發現在gcc和MSVC下,我也必須有lib2,否則鏈接器報告它找不到f4()

我試過鏈接器標記--as-needed但它沒有幫助。所以我的問題是:有沒有什麼辦法(例如鏈接器標誌),我可以用來成功建立main.exe沒有lib2?假設我無法修改任何C++源代碼。

+0

簡短的回答是:沒有,沒有。 –

+0

假設你正在鏈接靜態庫,當鏈接器與lib1鏈接並且看到它調用了f4時,它將嘗試鏈接lib2。我認爲你需要兩個。 – Dan

+0

我認爲目標文件格式並不表示所有的依賴關係,所以它不能在鏈接時告訴'f4'不可以被重複使用。 – Barmar

回答

0

標誌--as-needed因爲鏈接試圖解決存在於你的目標文件的任何不確定的標識符不起作用。

基本上你必須包含f4()的實現。但出於任何原因,你不想爲連接器提供lib2,你可以創建一個虛擬的lib2,其中包含你的虛擬實現f4(使f4函數爲空的cpp文件將做到這一點)。

例如:

gcc main.cpp lib1.o lib2_dummy.cpp -o main.exe 
+0

謝謝。這實際上是我解決問題的方式。 – stanleyli

0

您可以將lib1.cpp分成兩個源模塊lib1a.cpp和lib1b.cpp,並將它們都包含在lib1庫中。然後鏈接器將能夠導入f3而不導入f2,所以不需要lib2。

lib1a.cpp

extern void f4(); 
void f2() { 
    f4(); 
} 

lib1b.cpp

void f3() { 
} 
+0

這個問題提示「假設我無法修改任何C++源代碼」 – gdlmx

相關問題