前提知识:
动态库后缀.so 静态库后缀.a
-c 只编译不链接
-o 指定输出名
-L 指定链接库的查找路径
-l 指定链接的库名
-I 文件里面包含了头文件,-I后面跟着查找头文件的路径
上面几项可以满足编译目标
生成.a文件
命令ar
q:快速追加。增加新模块到库的结尾处
t 查看.a文件里面包含的成员
x 提取出.a文件里的成员,如果不指定提取的成员,将全部提取(注:不删除归档文件里的成员)
例:
G2DBT1:/wxp/so_a#ar t libhu.a
libhu.o
cmaps.o
sccsid.o
libhu_r.o
libhu32_r.o
libhu32.o
G2DBT1:/wxp/so_a#ar x libhu.a libhu.o
G2DBT1:/wxp/so_a#ls
libhu.a libhu.o
d 删除模块中的成员
例:
G2DBT1:/wxp/so_a#ar d libhu.a libhu.o
G2DBT1:/wxp/so_a#ar t libhu.a
cmaps.o
sccsid.o
libhu_r.o
libhu32_r.o
libhu32.o
m 移动模块中成员的顺序,配合a(移动到指定成员的后面) b(移动到指定模块的前面) 来使用,如果不指定移动的位置,默认为最后面
G2DBT1:/wxp/so_a#ar -mb cmaps.o libhu.a libhu.o
G2DBT1:/wxp/so_a#ar t libhu.a
libhu.o
cmaps.o
sccsid.o
libhu_r.o
libhu32_r.o
libhu32.o
v 列出执行过程中的附加信息
据以上得出如果创建一个.a文件,命令如下:
/enpc/wxp/so_a$cc -c sayhello.c
/enpc/wxp/so_a$ls
hello.c sayhello.c sayhello.o
/enpc/wxp/so_a$ar -rv libhello.a sayhello.o
ar: Creating an archive file libhello.a.
a - sayhello.o
/enpc/wxp/so_a$ls
hello.c libhello.a sayhello.c sayhello.o
函数调用.a的命令
/enpc/wxp/so_a$cc hello.c -L./ -lhello -o sayhello
/enpc/wxp/so_a$ls
hello.c libhello.a sayhello sayhello.c sayhello.o
/enpc/wxp/so_a$./sayhello
say hello
/enpc/wxp/so_a$ldd sayhello
sayhello needs:
/usr/lib/libc.a(shr.o)
/unix
/usr/lib/libcrypt.a(shr.o)
ldd的命令里面居然没有libhello.a文件
静态文件,有没有或许都不重要!
生产一个动态文件:
使用makefile文件来生产静态库并调用成功
该文件还不是很成功
clean:
-rm *.o
-rm *.a
all:main.o libhello.a
cc -o all main.o -L./ -lhello
main.o:hello.c
cc -c hello.c -o main.o
libhello.a:sayhello.o
ar -rv libhello.a sayhello.o
sayhello.o:sayhello.c
cc -c sayhello.c -o sayhello.o