歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux ranlib的用法

Linux ranlib的用法

日期:2017/2/28 16:15:33   编辑:Linux教程

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 手冊)。

Copyright © Linux教程網 All Rights Reserved