2013-02-13 77 views
6

我能想到的唯一優勢是編譯速度。在這兩種情況下的最終結果(二進制大小和速度)應該是相同的(當然,除非靜態庫沒有經過優化編譯)。使用預編譯靜態庫直接包含源代碼的優點是什麼?

還有一些參考將不勝感激。

更新:當我們不得不在我們的項目中包含小型第三方開源庫時,出現了這個問題。一位開發人員聲明,包括預編譯靜態庫(而不是僅複製源文件)會提高應用程序的性能。我沒有看到爲什麼會出現這種情況。

所以問題是:包含預編譯的庫真的會提高最終應用程序的性能嗎?

回答

3

如果你在談論第三方庫,它們的一些優點是:不需要發佈源代碼,(對於最終開發者來說可能)更簡單的安裝......雖然有時會變成更多一個麻煩,特別是如果它沒有做好(在沒有修復符號的情況下鏈接到其他開源項目,支持錯誤的體系結構)。

如果你的意思只是你自己的代碼 - 似乎你只是爲自己製造麻煩。如果這些文件沒有改變,它們將被編譯到磁盤上(.o),編譯器將不需要重新編譯它們,除非你進行清理/重新編譯。所以你可能無法獲得編譯速度。

無論哪種方式 - 是的,輸出應該是相同的。一個靜態鏈接的庫僅僅是你將直接鏈接到的相同.o文件的集合。

編輯:

的.o VS .A的具體尋址速度 - 。一個很簡單的發展過程中便於包裝.o文件的集合。一旦鏈接,結果是相同的。我只是做了一個快速的理智測試來驗證:

$ cat a.c 
#include <stdio.h> 

extern char *something(); 

int main() 
{ 
    printf("%s", something()); 
    return 0; 
} 
$ cat b.c 
char *something() 
{ 
    return "something fancy here\n";  
} 

$ gcc -c -o a.o a.c 
$ gcc -c -o b.o b.c 
$ gcc -o foo1 a.o b.o 
$ ar -r b.a b.o 
ar: creating archive b.a 
$ gcc -o foo2 a.o b.a 
$ cmp foo1 foo2 

而你有它,相同的二進制文件通過鏈接.o與.a。

有一個輕微的性能命中如果您使用動態庫,而不是靜態庫(我相信只有當查找符號時)。也許這就是其他開發者所指的,靜態庫比動態庫要快一些。

+0

我同意太多這個答案來回答我自己。但只是想補充一點,這要看你是誰,項目是什麼。擁有自己的東西,你擁有源代碼並且不必擔心共享,然後靜態庫是毫無意義的,只是額外的工作,沒有回報。如果您打算髮布給其他人,那麼它們對於保護您的源代碼非常有用。預編譯並準備使用。 – 2013-02-14 16:00:59

+0

我已更新問題以更好地顯示它的上下文。據我瞭解,靜態庫或多或少是編譯器的原始輸出,因此在鏈接階段,它應該與由編譯器生成的靜態庫或.o文件進行鏈接。 – DexM 2013-02-15 12:00:17

+0

已更新的答案以解決您更新的問題。 – escrafford 2013-02-15 17:37:07

相關問題