2014-09-01 64 views
-1

我想鏈接到由22個靜態庫(.a)文件組成的外部庫。當我使用visual studio時,我只需要將目錄傳遞給VS,它將鏈接到目錄中的文件。用gcc我首先想到的是,在gcc中的靜態鏈接(mingw)

-LC:\...\directory_of_library -lsth1 -lsth2 -lsth3 ... -lsth22 

,我試圖找到一個更好的辦法比。

此外,會有'overlinking'的問題嗎?因此與更多的圖書館聯繫在一起超過必要或者編譯器會聰明地忽略冗餘部分?

+0

「試圖找到比」更好的方式「 - 因爲它不起作用? – 2014-09-01 21:32:39

+0

,因爲我很懶,我不喜歡打太多的東西,當然肯定有效:) – MinjaeKim 2014-09-01 21:36:33

+0

你其實已經問了兩個問題。第二個也許是合法的和有趣的,第一個只是微不足道的,容易導致第二個被忽視,並承認它是由懶惰引起的,會吸引下流。你花了更多的時間輸入問題,而不是在一個IDE項目或makefile中輸入* once *。 – Clifford 2014-09-01 21:50:29

回答

1

當連接掃描庫文件,它只鏈接解析未被早期對象代碼或庫解析的符號所需的對象代碼。來自存檔的未引用對象代碼將不會被鏈接。

指定冗餘庫可能會延長構建時間。您可以通過首先指定最常用的庫來幫助解決問題,但除了最大的項目之外的所有項目都不太可能是重要的。

2

1)您的命令只是「鏈接」。現在情況很好。 2)「靜態」鏈接意味着指定「-Bstatic」,或者指定一個靜態的「.a」庫。

這裏有幾個不錯的鏈接解釋 「靜態」 與 「動態」 鏈接:

+0

你能再解釋一下嗎?我目前對靜態和動態鏈接的深入理解是,前者將在編譯時引用預編譯的.a或.lib文件,並構成一個大的可執行文件,而後者則表示.dll或.so(?)文件必須單獨設置才能與可執行文件一起運行。簡單的「鏈接」有什麼不同? – MinjaeKim 2014-09-01 21:43:26

+0

您對.a/lib(靜態)與.so/.dll的理解完全正確。我急於補充說,動態庫是一件好事。 「鏈接」將對象模塊(.o/.obj),靜態和動態庫的任意組合綁定到可執行文件(.exe)中。最後注意:鏈接器自動只包含最終可執行文件中的「需要」。共享庫有額外的好處,即「需要什麼」在運行時確定。 .so的/ .dlls可以在正在運行的進程之間「共享」。這可能導致內存使用效率很高。 – FoggyDay 2014-09-01 21:55:44