window/linux程序編譯小結

一.window:
1.編譯:源文件.c->預編譯代碼.i->編譯代碼.s->彙編代碼.o文件
2.鏈接:
a.靜態鏈接庫:o文件中可能會需要用到外部函數,我們通過鏈接.lib文件,通過lib文件將對應dll文件的部庫函數粘貼到.o文件的指定位置。
b.動態鏈接庫.dll:.dll與靜態庫類似,但是是在程序運行過程中進行鏈接。
3.連接完了就可以完成運行。

*補充動態庫的使用有兩種方法:
1)動態鏈接:鏈接時將動態庫導出的.lib文件鏈接到可執行文件中去。當程序加載到內存時,會有動態鏈接器將要加載的動態庫加載到內存[已在內存則不用加載],此時該.dll內存地址確定,動態鏈接器將程序中的.lib部分中函數跳轉地址改爲原來的偏移地址加上該.dll起始地址的結果。這樣就可以找到要調用的函數位置了。至於多進程共享一個動態庫,每次動態連接器都將內存中的同一個庫的地址映射到不同的進程空間[虛擬內存];映射到不用的進程空間的地址很可能是不同的。
2)動態加載:即在程序運行的過程中及時的將需要的庫加載進內存[已存在則不用加載],通過相應的API拿到需要使用的動態庫函數接口地址,使用函數指針的方式去使用,在使用完後可以動態的卸載動態庫。

二.linux:
1.編譯
源文件.c->預編譯代碼.i->編譯代碼.s->彙編代碼.o

2.鏈接:
.o文件+>共享庫.so 生成可執行文件。
Linux的共享庫與windows的動態庫本質相同,特別是在動態加載時。差異主要體現在Linux的共享庫產生.so文件時不會同時導出一個類似.lib的文件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章