1. 什么是库?
预先编译好的集合就是库。
根据连接时期不同,库分为静态库和共享库。静态库是在程序编译时期链接的,动态库是在程序运行时期链接的。
linux上库的命名一般位libxxx.a(静态库)libxxx.so动态库,库文件存放的地点位/lib或者/usr/lib。
2.静态库的生成
<1>.将所有.c文件编译成.o文件 命令是 gcc -c main.c 生成main.o文件
<2> 将所有的.o文件打包生成静态库 命令是 ar crv libfoo.a main.o
3. 共享库的生成
<1>.将所有的.c文件编译成.o文件 命令是 gcc oc main.c 生成main.o文件
<2>. 将所有生成的.o文件处理成共享库 假设共享库的名字为libfoo.so
对应的命令就是 gcc -shared -fPIC -o libfoo.so main.o
-shared:表示输出结果是共享库类型
-fPIC:作用于编译阶段,告诉编译器产生与位置无关代码,则产生的代码中,没有绝对地址,全部使用相对地址,所以代码可以被加载器加载到内存的任意位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的
库的使用
命令:gcc -o main main.c -L路径 -l库名
例如:gcc -o main main.c -lpthread 使用多线程的库
注意:/usr/include 存放的是头文件和声明
/usr/lib 存放的是用户的库文件
/usr/bin 存放的是用户的可执行程序
ldd main可以查看main程序用到了哪些库
4.总结
链接静态库其实从某种意义上来讲也是一种粘贴复制,只不过它的操作对象是目标代码而不是源代码。因为静态库被链接后库就直接嵌入可执行文件中了,这样就会浪费系统空间。如果多个程序链接了同一个库,则每生成一个可执行文件就会有一个库的副本,必然会浪费系统空间。
而动态库的出现就弥补了静态库上的弊端,因为动态库是在程序运行时被链接的,所以磁盘上只保留一份副本,因此节约了磁盘空间。如果发现了bug或要升级也很简单,只要用新的库把原来的替换掉就行了。因为动态库在程序运行时被链接,所以程序的运行速度会比链接静态库的版本慢。当然,和动态科库的优点比起来缺点就微不足道了。