關於編譯成庫檔案是否會智慧型鏈結的問題

2021-06-01 08:40:01 字數 954 閱讀 4951

2011-10-25

將部分**編譯成庫檔案(.lib gnu為.a)然後另乙個工程去呼叫庫檔案裡的函式可以做到智慧型鏈結,即沒有呼叫的檔案將不會鏈結,這樣可以將所有**都寫好,呼叫的時候只要不呼叫就不會增加編譯**大小。

如果將**寫在乙個工程中會有一些缺點:

1、編譯時間長,因為**量巨大。

2、生成二進位制檔案過大,因為只有乙個工程,編譯器並不知道那些是主程式,哪些只是模組,所以必然會把所有**都編譯了,而實際上很多模組在程式從頭到尾都沒有被呼叫,這部分就極大增加了**量,只能通過配置檔案裁剪,直接將**注釋掉。

使用庫檔案,如.a檔案的方法可以解決以上兩個問題:

1、由於已經將那部分長期不改動的**編譯成庫,那麼就不用每次編譯他們,只要在最後鏈結即可,減小了編譯時間。

2、有智慧型鏈結功能,本質上就是通過這種方法,告訴編譯器哪個是主程式,哪個是模組程式,那麼主程式沒有呼叫的程式必然就可以排除在外了,這樣就減小了生成的二進位制檔案。

經過測試,對智慧型鏈結的形式是以單個檔案為單位的形式鏈結的,並不是精確到函式,如

lib1.c

void libfunc1 (void)

void libfunc2 (void)

lib2.c

void libfunc3 (void)

以上編譯成.a(ps:鏈結庫寫庫名稱的時候不要寫字首lib,如生成libtest.a 庫名稱只寫test)

main.c

int main (void)

結果:1k

int main (void)

結果:1k

int main (void)

結果:2k

從以上實驗可見,由於libfunc1()和libfunc2()在同一檔案lib1.c中,所以只要呼叫了其中乙個函式,那麼整個檔案lib1.o就被鏈結了,所以無論呼叫乙個libfunc1()還是呼叫libfunc1()和libfunc2()大小都是一致的。

cuda檔案編譯成動態庫

想把幾個cuda的原始檔搞成乙個動態庫,用nvcc將各個庫都編譯成了o檔案,可是連線的時候出現了錯誤 rodata can t used when a shared object rodata是常量資料段 read only data 檢查了 沒有出現常量。很奇怪,後來在網上找到該問題的解答 在編譯...

將js檔案編譯成動態鏈結庫 dll 檔案

將js檔案編譯成動態鏈結庫 dll 檔案 1.向專案中新增 jscript 檔案 script 1.js function doclick1 script 2.js function doclick2 2.解決方案資源管理器中,右鍵檢視 script 1.js 和script 2.js 的屬性,把高...

將js檔案編譯成動態鏈結庫 dll 檔案

1.向專案中新增jscript檔案 script 1.js function doclick1 script 2.js function doclick2 2.解決方案資源管理器中,右鍵檢視script 1.js和script 2.js的屬性,把高階中的 生成操作 屬性設定成 嵌入的資源 4.向專案...