共享库(.so 或 .sa):程序在运行的时候才去链接共享库的代码,多个程序可以共享使用库的代码。共享库可以在多个程序间共享,所以动态链接使得可执行程序文件更小,节省了磁盘空间,操作系统采用虚拟内存机制允许物理内存中的一份共享库被要用到该库的所有进程共用,节省了内存和磁盘空间。
一个与共享库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数在目标文件的整个机器码。
在可执行文件开始运行以前,外部的机器码由操作系统从磁盘上的该共享库中复制到内存中,这个过程成为动态链接(dynamic linking)。
5. 生成静态库生成静态库可以理解为将一个对.o文件的归档。将一个或多个.o文件打包生成.a文件。
可以使用ar工具,例如:
➜ test gcc -Wall -c hello.c -o hello.o ➜ test ar rcs libhello.a hello.o ➜ test ls -l libhello.a -rw-rw-r-- 1 menwen menwen 1518 7月 16 14:33 libhello.a // ar是gnu的归档工具 // rcs = replace、create、save接下来就是将生成的.a库文件和调用库函数的文件生成可执行文件。
➜ test gcc -Wall main.c libhello.a -o main ➜ test ./main hello world这样生成可执行文件时要注意main.c libhello.a这两个文件的书写顺序,否则编译会出错。
还有一种方法来生成可执行文件,就是通过-l选项。例如:
➜ makefile gcc -Wall -L. main.c -o main -lhello ➜ makefile ./main hello world // -L.:-L选项来指定库的位置,在当前目录下 6. 生成共享库生成共享库的过程如下:
➜ makefile gcc -Wall -c -fPIC hello.c // 编译生成.o文件时一定要加上-fPIC选项 ➜ makefile gcc -shared -fPIC hello.o -o libhello.so ➜ makefile ls -l libhello.so -rwxrwxr-x 1 menwen menwen 8024 7月 16 14:58 libhello.so // -shared:生成共享库格式 // -fPIC:产生位置无关码(position independent code)链接库生成可执行文件:
gcc -Wall -L. main.o -o main -lhello ➜ test ./main ./main: error while loading shared libraries: libhello.so: cannot open shared object file: No such file or directory但是执行可执行文件时报错:无法链接到共享库。因此我们要运行共享库,一共有三种方式:
拷贝.so文件到系统共享库路径下,一般是/usr/lib
更改LD_LIBRARY_PATH
ldconfig。配置/etc/ld.so.conf,ldconfig更新ld.so.cache
我们将生成的.so库拷贝到系统共享库路径下,就可以成功执行
➜ test sudo cp libhello.so /usr/lib ➜ test ./main hello world 7. 库搜索路径C_INCLUDE_PATH、LIBRARY_PATH(在~/.bash_profile文件中配置用户的环境变量)
从左到右搜索-I、-L指定的目录
由环境变量指定的目录
由系统指定的目录
如果按照以上顺序无法找到链接的库,则会报错。