2017-04-03 98 views
2

我正在構建一個依賴於靜態庫A的可執行文件,而靜態庫A又取決於靜態庫B.當我構建我的應用程序時,是否還需要在構建腳本中鏈接B?靜態鏈接庫是否需要鏈接它們的依賴關係?

更具體一點,我需要做-la -lb,還是隻通過-la連接A就夠了?

+0

在哪個操作系統上? –

+0

@BasileStarynkevitch Linux。 – jeffreyveon

+0

這應該進入問題(也許作爲標籤)。 –

回答

2

根據A的構建方式,您可能需要也可能不需要鏈接兩個庫。

如果A包含鏈接器註釋記錄,指示鏈接器也在庫B中查找符號(通常包含在A中包含的一個對象文件中),則鏈接時不需要包含B.如果A不包含該評論記錄,則必須自己包含它。

-1

靜態庫在編譯時完全包含在使用程序中,因此它不需要任何額外的文件來運行程序。

如果庫A已經與靜態庫B一起構建,則A已經擁有B並且不再需要它。

+0

我不認爲這是正確的。靜態庫仍然可能存在未解決的依賴關係,鏈接器將會抱怨。在編譯期間,每個庫在庫編譯階段至少需要訪問其依賴庫的頭文件,但是不會嘗試鏈接到相關庫,因爲這可能會導致項目包含相同庫的多個副本,靜態庫項目沒有鏈接階段。 – PaulHK

+0

@PaulHK什麼時候編譯完成的靜態庫A會抱怨什麼?如果A已經編譯完成,則B的部分完成。要在某個完整的程序中使用A,必須進行編譯。 – deviantfan

+2

圖書館A不會抱怨它的依賴關係,除非它包含在具有鏈接器傳遞的項目中。編譯一個庫不需要鏈接到任何相關的庫,因此爲什麼我提到庫只需要訪問相關的庫頭,而不是它的目標文件。 – PaulHK

0

如果A和B都是靜態的,則必須按A和B的順序(-la -lb)連接兩者。請參閱this reply瞭解訂單的說明。

靜態鏈接的程序包括鏈接到可執行文件內部的庫。

想象一下,您的程序在A內部調用foo(),並在A的某個地方調用bar()。所以如果A成爲你的程序的一部分,你的程序中有一個未定義的bar()調用,這就是爲什麼你需要鏈接到B的原因。

例外情況是使用special Visual Studio pragma#pragma comment(lib, libname)),如@ 1201ProgramAlarm所述。