Linux系统编程 26 静态库的制作
学习笔记
lib的好处:
1.不会以代码的形式存在
2.省去编译的过程,节省时间
制作静态库的方法
:借助ar工具
格式:ar rcs libxxx.a xx1.o xx2.o
ar rcs lib静态库名.a 要使用的原材料目标文件
参数r:在库中插入模块(替换)。当插入的模块名已经在库中存在,则替换同名的模块。如果若干模块中有一个模块在库中不存在,ar显示一个错误消息,
并不替换其他同名模块。默认的情况下,新的成员增加在库的结尾处,可以使用其他任选项来改变增加的位置。
参数c:创建一个库。不管库是否存在,都将创建。
参数s:创建目标文件索引,这在创建较大的库时能加快时间。(补充:如果不需要创建索引,可改成大写S参数;如果。a文件缺少索引,可以使用ranlib命令添加)
参数r 还要进一步理解
静态库制作步骤:
1.将.c 生成 .o
gcc -c ***.c -o ***.o
2.使用ar工具制作静态库
ar rcs lib静态库名.a 要使用的原材料目标文件
静态库名字:一般直接叫***库文件
3.编译静态库到可执行文件中去
gcc ***.c lib***.a -o ***.out
$mkdir staticlib
$ls
file file2 hello hello.c inc staticlib
$cd staticlib/
$ls
$vi add.c
$ls
add.c div1.c sub.c
$gcc -c add.c -o add.o
$gcc -c div1.c -o div1.o
$gcc -c sub.c -o sub.o
$ls
add.c add.o div1.c div1.o sub.c sub.o
$ar rcs libmymath.a add.o div1.o sub.o
$ls
add.c add.o div1.c div1.o libmymath.a sub.c sub.o
libmymath.a: current ar archive
$cat add.c
int add(int a,int b)
{
return (a+b);
}
$cat div1.c
int div1(int a, int b)
{
return (a/b);
}
$cat sub.c
int sub(int a, int b)
{
return (a-b);
}
$mkdir resource
$ls
add.c add.o div1.c div1.o libmymath.a resource sub.c sub.o
$mv ./*.o ./resource/
$mv ./*.c ./resource/
$ls
libmymath.a resource
$vi test.c
$gcc -c test.c -o test.o
$ls
libmymath.a resource test.c test.o
$gcc test.c -o test.o
/tmp/cc4rWoN4.o: In function `main':
test.c:(.text+0x2d): undefined reference to `add'
test.c:(.text+0x5a): undefined reference to `sub'
test.c:(.text+0x87): undefined reference to `div1'
collect2: error: ld returned 1 exit status
出错地方是链接,不是编译错误,如果是编译出错,会有行号
链接阶段是二进制文件,所以没有行号
collect2:链接器
ld 驱动链接器去工作
test.c 内容:
#include <stdio.h>
int main(int argc, char *argv[])
{
int a=4,b=6;
printf("%d+%d=%d\n",a,b,add(a+b));
printf("%d-%d=%d\n",a,b,sub(a,b));
printf("%d/%d=%d\n",a,b,div1(a,b));
}
使用静态库
$
$gcc test.c ./libmymath.a -o test.out
$^C
$ll
total 32
drwxrwxr-x 3 ubuntu ubuntu 4096 Dec 8 12:54 ./
drwxrwxrwx 4 root root 4096 Dec 8 12:35 ../
-rw-rw-r-- 1 ubuntu ubuntu 3982 Dec 8 12:39 libmymath.a
drwxrwxr-x 2 ubuntu ubuntu 4096 Dec 8 12:45 resource/
-rw-rw-r-- 1 ubuntu ubuntu 703 Dec 8 12:50 test.c
-rwxrwxr-x 1 ubuntu ubuntu 8696 Dec 8 12:54 test.out*
$cd resource
$ll
total 32
drwxrwxr-x 2 ubuntu ubuntu 4096 Dec 8 12:45 ./
drwxrwxr-x 3 ubuntu ubuntu 4096 Dec 8 12:54 ../
-rw-rw-r-- 1 ubuntu ubuntu 552 Dec 8 12:37 add.c
-rw-rw-r-- 1 ubuntu ubuntu 1232 Dec 8 12:38 add.o
-rw-rw-r-- 1 ubuntu ubuntu 554 Dec 8 12:37 div1.c
-rw-rw-r-- 1 ubuntu ubuntu 1232 Dec 8 12:39 div1.o
-rw-rw-r-- 1 ubuntu ubuntu 553 Dec 8 12:37 sub.c
-rw-rw-r-- 1 ubuntu ubuntu 1240 Dec 8 12:39 sub.o
$gcc -c test.c -o test.o
$ls
libmymath.a resource test.c test.o test.out
$ll
total 36
drwxrwxr-x 3 ubuntu ubuntu 4096 Dec 8 12:56 ./
drwxrwxrwx 4 root root 4096 Dec 8 12:35 ../
-rw-rw-r-- 1 ubuntu ubuntu 3982 Dec 8 12:39 libmymath.a
drwxrwxr-x 2 ubuntu ubuntu 4096 Dec 8 12:45 resource/
-rw-rw-r-- 1 ubuntu ubuntu 703 Dec 8 12:50 test.c
-rw-rw-r-- 1 ubuntu ubuntu 1912 Dec 8 12:56 test.o
-rwxrwxr-x 1 ubuntu ubuntu 8696 Dec 8 12:54 test.out*
test.out 比 test.o 要大
执行
$./test.out
4+6=-2011355806
4-6=-2
4/6=0
$