2012-03-21 115 views
2

我有一個程序在編譯時使用-L(mylib.a)(使用eclipse cdt)靜態鏈接到Linux中的另一個庫。C++ linux中的靜態鏈接用法:每次更改庫時是否需要重新編譯所有內容?

對我的理解,鏈接是靜態的這一事實意味着庫被插入到我的二進制文件中。這是否意味着如果我對mylib進行更改,我需要重新編譯我的二進制文件? 我是這麼認爲的,但是我想確定一下,因爲它在時間上是一個很大的開銷。請注意,如果對mylib進行了更改,那麼eclipse意識到它需要重新編譯,但它不能識別二進制本身需要重新編譯,即使它鏈接到mylib。

回答

1

是的,您應該使用修改後的庫重新生成代碼,以生成鏈接到新庫和更新庫的二進制文件。

一個項目的建設可以打破在兩個里程碑階段:
編譯:
在這個階段的編譯器編譯每個翻譯單位。它檢查源代碼的有效語法等並生成目標文件。這些目標文件包含源代碼的彙編代碼輸出。

鏈接:
在該階段期間,接頭連接在一起的目標文件和庫以產生一個可執行文件。

當應用程序或項目使用靜態庫時,它包含通常稱爲庫接口的頭文件,其中包含應用程序使用的API列表和其他構造。應用程序還需要鏈接庫文件。

顯然,如果接口是完整的,即應用程序包含的庫頭文件未更改,則不需要編譯,但只需鏈接到更新的庫。

但是,我不認爲有一種方法可以通過eclipse IDE重新鏈接更新的庫,因此您應該重新構建基本上可以滿足需求的項目。
例如:
重新編譯您的項目並將新庫重新鏈接到它或
只需將新庫重新鏈接到您的項目。

+0

鏈接不是編譯的一部分,儘管它通常也是用編譯器命令完成的。 – leftaroundabout 2012-03-21 09:46:55

+0

@leftaroundabout:我確定知道編譯和鏈接是兩個獨立和不同的過程。當然,兩者都可以單獨從命令行完成,但我不認爲它們可以在日食中單獨完成,其中OP使用&因此是答案。 – 2012-03-21 09:48:38

+0

也許「重建」比「重新編譯」更少爭議。 – juanchopanza 2012-03-21 09:55:09

3

如果您沒有更改庫的接口(即標題),則只有重新鏈接就足夠了。

+0

謝謝。你有任何想法如何執行只在eclipse中重新鏈接? – dan12345 2012-03-21 09:45:55

相關問題