inux下編譯靜態庫的時候,ar不帶任何選項打包成.a檔案後,對其進行ranlib操作有 什麼用,如果不進行ranlib操作會有什麼後果,我編譯的時候沒用這步操作也能正常執行,請達人給講解一下。謝謝。
更 新靜態庫的符號索引表
本小節的內容相對簡單。前邊提到過,靜態庫檔案需要使用「ar」來建立和維護。當給靜態庫增建乙個成員時(加入一 個.o檔案到靜態庫中),「ar」可直接將需要增加的.o檔案簡單的追加到靜態庫的末尾。之後當我們使用這個庫進行連線生成可執行檔案時,鏈結程式 「ld」卻提示錯誤,這可能是:主程式使用了之前加入到庫中的.o檔案中定義的乙個函式或者全域性變數,但連線程式無法找到這個函式或者變數。
這 個問題的原因是:之前我們將編譯完成的.o檔案直接加入到了庫的末尾,卻並沒有更新庫的有效符號表。連線程式進行連線時,在靜態庫的符號索引表中無法定位 剛才加入的.o檔案中定義的函式或者變數。這就需要在完成庫成員追加以後讓加入的所有.o檔案中定義的函式(變數)有效,完成這個工作需要使用另外乙個工 具「ranlib」來對靜態庫的符號索引表進行更新。
我們所使用到的靜態庫(文件檔案)中,存在這樣乙個特殊的成員,它的名字是 「__.symdef」。它包含了靜態庫中所有成員所定義的有效符號(函式名、變數名)。因此,當為庫增加了乙個成員時,相應的就需要更新成員 「__.symdef」,否則所增加的成員中定義的所有的符號將無法被連線程式定位。完成更新的命令是:
ranlib archivefile
通常在makefile中我們可以這樣來實現:
libfoo.a: libfoo.a(x.o) libfoo.a(y.o) ...
ranlib libfoo.a
它 所實現的是在更新靜態庫成員「x.o」和「y.o」之後,對靜態庫的成員「__.symdef」進行更新(更新庫的符號索引表)。
如果 我們使用gnu ar工具來維護、管理靜態庫,我們就不需要考慮這一步。gnu ar本身已經提供了在更新庫的同時更新符號索引表的功能(這是預設行為,也可以通過命令列選項控制ar的具體行為。可參考 gnu ar工具的man手冊)。
linux下的靜態庫
linux下檔案的字尾名只是為了方便程式設計師知道這是什麼型別的檔案,不用來識別檔案型別。其中.so檔案 shared object 是動態庫 共享庫 相當於windows下的.dll a檔案是 archive 歸檔包 靜態庫 由多個.o檔案打包而來,相當於windows下的.lib o檔案是原始碼...
Linux下靜態庫編譯
linux下動態庫檔案的擴充套件名為 so shared object 按照約定,所有動態庫檔名的形式是libname.so 可能在名字中加入版本號 這樣,執行緒函式庫被稱作libthread.so。靜態庫的檔名形式是libname.a。共享archive的檔名形式是libname.sa。共享arc...
Linux下的動態庫和靜態庫
靜態庫 程式編譯時載入,可執行程式體積大。一般命名為lib x.a。動態庫 程式執行時載入,可執行程式體積小。一般命名為lib x.so.1.3。x一般指庫名,如libxml2 tinyxml等 動態庫一般預設安裝在 lib 或者 usr lib 或者 usr local lib下。如果安裝的庫不在...