所謂靜態鏈結是指把要呼叫的函式或者過程鏈結到可執行檔案中,成為可執行檔案的一部分。當多個程式都呼叫相同函式時,記憶體中就會存在這個函式的多個拷貝,這樣就浪費了寶貴的記憶體資源。.so檔案是共享庫檔案(動態鏈結)。動態鏈結所呼叫的函式**並沒有被拷貝到應用程式的可執行檔案中去,而是僅僅在其中加入了所呼叫函式的描述資訊(往往是一些重定位資訊),僅當應用程式被裝入記憶體開始執行時,在作業系統的管理下,才在應用程式與相應的.so之間建立鏈結關係。
.a檔案是多個.o檔案的組合。.o檔案就是物件檔案,裡面包含的內容就是01這樣的機器可執行的指令,當程式要執行時還需要進行鏈結(link).鏈結就是把多個.o檔案鏈成乙個可執行檔案。
可以參考:
事情源於一次gdb除錯。因為要gdb 3rdpary庫的原始碼,發現編譯的服務的debug版本並不能檢視到對應檔案的符號,後來發現是 這個3rdpary庫中的檔案編譯成了.a的靜態庫,然而這個的靜態庫並不是 release版本,並沒有 -g的選項。於是先編譯了debug版的靜態庫,然後再編譯debug的服務。gdb即可
dll檔案和 so檔案
記得很早之前有乙個很流行的病毒,就是以.dll為字尾的檔案製作而成,當時只是通過微軟更新的系統,修復漏洞就沒管了,對當時mac系統沒受到攻擊也沒有在意,只知道是說這個是windows的漏洞,所以mac系統都沒事。還有一次接觸dll是在剛開始使用tomcat的時候,執行tomcat報錯,但是可以成功啟...
linux下生成 so檔案和 a檔案
test.h 1 ifndef test h 2 define test h 34 void testa 5void testb 67 endif test a.cpp 1 include 2 include test.h 3 4void testa 5 test b.cpp 1 include 2...
linux下生成 so檔案和 a檔案
1.o 就相當於windows裡的obj檔案 乙個.c或.cpp檔案對應乙個.o檔案 a 是好多個.o合在一起,用於靜態連線 即static mode,多個.a可以鏈結生成乙個exe的可執行檔案 so 是shared object,用於動態連線的,和windows的dll差不多,使用時才載入。得到了...