库是二进制实现。

头文件所在位置: /usr/include

环境变量:

.h文件要留给用户查看

man string.h

动态库与静态库:静态库相当于私家车,某个人或某个家庭使用,静态库可以不在标准位置。动态库相当于公交车,是系统提供的,在系统特定目录。动态库是共享库,供大家一起使用。静态库会在编译时直接装载到程序,程序代码会比较大。动态库在编译时是引用库文件。

静态库:

libxx.a xx指代库名

制作:ar -cr libxx.a yy.o

发布到

/usr/local/include

/usr/local/lib

使用时:

gcc -L/usr/local/lib -o main main.0 -lxx //放到标准位置时前面的-L/usr/local/lib 可省略,-lxx也可省略。在文件当中引用头文件时使用尖括号即可。-l参数必须放在最后面,有依赖。

动态库:

.so代表动态库

libxx.so

制作:gcc -shared -fPIC -o libxx.so yyy.c。 -f后面的PIC也可以是小写。

发布到

/usr/local/include

/usr/local/lib

在/etc/ld.so.conf中添加路径/usr/local/bin/,改完后,运行/sbin/ldconfig命令重读/etc/ld.so.conf文件。

gcc -I/usr/local/include -L/usr/local/lib -o … -lxx

上述命令中的-I/usr/local/include -L/usr/local/lib都可以省略

lld:打印出程序所引用的动态库,不会显示静态库。

[root@aliyun apue]# ldd ./a.out
        linux-vdso.so.1 =>  (0x00007ffcfc7f2000)
        libc.so.6 => /lib64/libc.so.6 (0x00007fbfe9821000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fbfe9bef000)
[root@aliyun apue]#

如果一个文件同时做成了同名的动态库和静态库,内核优先链接动态库。

非root用户发布:

cp xx.so ~/lib

export LD_LIBRARY_PATH=~/lib

两个库有依赖关系:

被依赖的库永远在后面库出现。否则会报错误。如下面stack库使用到llist库中的函数,则编译时:

gcc -o main main.c -lstack -lllist

编译时最后的-lxx,是不是可以省略,也可以引用到这个库呢?不可以,除非能改动标准库,将自己的内容加到标准库,否则不可省。

手工装载库: