更新靜態庫的符號索引表
本小節的內容相對簡單。前邊提到過,靜態庫檔案需要使用「
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
手冊)。
mysql更新索引庫 Mysql資料庫索引增刪改查
一.索引的作用 一般的應用系統,讀寫比例在10 1左右,而且插入操作和一般的更新操作很少出現效能問題,遇到最多的,也是最容易出問題的,還是一些複雜的查詢操作,所以查詢語句的優化顯然是重中之重。在資料量和訪問量不大的情況下,mysql訪問是非常快的,是否加索引對訪問影響不大。但是當資料量和訪問量劇增的...
LINUX靜態庫與動態庫符號衝突問題分析與解決
1.問題重現模型 為了重現問題並去掉無關干擾細節,我們將構建乙個最簡單的可執行模組和依賴模組的關係鏈,程式依賴模型如下 1.1 解釋 1 有乙個名為rtsp的第三方庫提供了公共介面rtsp open,rtsp可以編譯為靜態庫librtsp static.a也可以編譯為動態庫librtsp share...
靜態庫的符號解析和重定義處理策略
一 什麼是靜態庫 將多個普通目標檔案打包成為乙個單獨的檔案,稱為靜態庫。靜態庫是為了解決以下問題而出現的 1 c使用者需要使用大量的c函式庫 把所有的 放在乙個.c檔案中,然後產品 一起編譯鏈結,雖然可以解決這個問題,但是不滿足 2 2 這些c函式需要單獨鏈結程序式,以減少空間浪費 把每個函式作為乙...