UNIX的ar命令
常用選項
原始碼檔案在編譯之後產生相應的目標檔案(.o檔案),通常製作靜態庫的過程就是將這些.o檔案打包成一個libXXXX.a檔案。
ar命令常用的幾個命令選項的含義如下:
-r格式:ar -r libXXXX.a 1.o 2.o說明:lib檔案不存在時,首先建立lib檔案,然後將.o檔案添加到靜態庫檔案中 -t格式:ar -t libXXXX.a說明:展示當前lib檔案中所包含的.o檔案 -d格式:ar -d libXXXX.a 1.o說明:將1.o從靜態庫檔案libXXXX.a中刪除 -x格式:ar -x libXXXX.a說明:將靜態庫檔案libXXXX.a中的所有檔案解壓出來 現在我們編輯兩個.c檔案,分別如下。1.c #include<stdio.h>
void func1() {
printf("call func1.\n");
}
//2.c
#include<stdio.h>
void func2() {
printf("call func2.\n");
}
做如下操作:
[linux@www.bkjia.com ar]$ ls
1.c 2.c
[linux@www.bkjia.com ar]$ gcc -c 1.c 2.c
[linux@www.bkjia.com ar]$ ls
1.c 1.o 2.c 2.o
[linux@www.bkjia.com ar]$ ar -r libtest.a 1.o
ar: creating libtest.a
[linux@www.bkjia.com ar]$ ar -r libtest.a 2.o
[linux@www.bkjia.com ar]$ ar -t libtest.a
1.o
2.o
[linux@www.bkjia.com ar]$ ar -d libtest.a 1.o
[linux@www.bkjia.com ar]$ ar -t libtest.a
2.o
[linux@www.bkjia.com ar]$ ar -r libtest.a 1.o
[linux@www.bkjia.com ar]$ rm -rf 1.o 2.o
[linux@www.bkjia.com ar]$ ls
1.c 2.c libtest.a
[linux@www.bkjia.com ar]$ ar -x libtest.a
[linux@www.bkjia.com ar]$ ls
1.c 1.o 2.c 2.o libtest.a
特別用法特別說明的是ar命令的-s用法.舊版本UNIX作業系統在使用ar添加一個.o檔案,如果相同名字的.o檔案已經存在於靜態庫,將替換這個.o檔案,否則就簡單的將這個.o檔案尾碼在靜態庫檔案的末尾.接著在使用ld進行連結時,可能還會報無法找到函數或者全域變數的錯誤。這是由於靜態庫檔案中的符號索引表資訊並沒有更新,依舊使用的是舊的.o檔案的符號表資訊。為了克服這個問題,提供了ranlib工具,進行符號表的更新,所以通常在一些版本比較老的UNIX程式的Makefile中通常能看到這樣的命令:libXXXX.a: 1.o 2.o ...ar -rv libXXXX.a 1.o 2.o ...ranlib libXXXX.a新版本的ar命令預設會更新符號表,因此不再需要使用ranlib來更新了。因為預設時符號表會被更新,所以 ar -rsv和ar -rv的功能是一樣的.可以使用nm命令來查看libXXXX.a中的符號表資訊。比如:
[linux@www.bkjia.com ar]$ nm -s libtest.a
Archive index:
func1 in 1.o
func2 in 2.o
1.o:
0000000000000000 T func1
U puts
2.o:
0000000000000000 T func2
U puts
[linux@www.bkjia.com ar]$
本文永久更新連結地址: