1. 静态库的制作
- ar rcs libmyhello.a hello.o
- gcc -o hello main.c -L. -lmyhello
2. 动态库的制作
- gcc -shared -fPCI -o libmyhello.so hello.o
- gcc -o hello main.c -L. -lmyhello
- ./hello //其中程序运行时会在/urs/lib和 /lib等目录下查找需要的动态库文件。因此我们需要将libmyhello.so复制到目录/usr/lib中,但是
3. 常用参数
- 格式:ar rcs libxxx.a xx1.o xx2.o
- 参数r:在库中插入模块(替换)。当插入的模块名已经在库中存在,则替换同名的模块。如果若干模块中有一个模块在库中不存在,ar显示一个错误消息,并不替换其他同名模块。默认的情况下,新的成员增加在库的结尾处,可以使用其他任选项来改变增加的位置.
- 参数c:创建一个库。不管库是否存在,都将创建。
- 参数s:创建目标文件索引,这在创建较大的库时能加快时间。(补充:如果不需要创建索引,可改成大写S参数;如果.a文件缺少索引,可以使用ranlib命令添加)
- 格式:ar t libxxx.a
- 显示库文件中有哪些目标文件,只显示名称。
- 格式:ar tv libxxx.a
- 显示库文件中有哪些目标文件,显示文件名、时间、大小等详细信息。
格式:nm -s libxxx.a - 显示库文件中的索引表。
- 格式:ranlib libxxx.a
- 为库文件创建索引表。
4. 编译程序命令
- 我们用gcc编译程序时,常常会用到“-I”, “-L”, “-i"等参数
gcc -o hello hello1.c hello2.c hello3.c -I/home/hello/include -L/home/hello/lib -lworld
- -I/home/hello/include:表示将/home/hello/include 目录作为第一个寻找源代码中引入头文件的目录,寻找的顺序是:/home/hello/include->/usr/include->/usr/local/include, 也就是指定优先查找的目录,找不到的话查找默认目录。如果没有-I相关的指定,那么就是默认头文件的位置在当前文件夹。
- -L/home/hello/lib:表示将/home/hello/lib目录作为第一个寻找库文件的目录,寻找的顺序是:/home/hello/lib->/lib->/usr/lib->/usr/local/lib, 如果-L. 表示当前文件夹, 如果-L./lib表示在当前文件夹下的lib文件夹里。
- -lword:表示寻找具体的库文件, 如果加上编译选项 -static,表示寻找静态库文件。也可以用-l/home/hello/lib/libword.a 来代替-L/home/hello/lib -lword.
5. 动态库和静态库的区别
- 动态库和静态库的本质区别是,动态库是在程序运行时链接的,而静态库在编译时把代码加入目标程序,那么程序运行时就不需要了。所以使用静态库时生成的目标程序可以脱离源码运行,而动态库生成的目标程序,还需要先安装库才行
- 使用gcc编译的静态库,在生成目标程序链接的过程中也只能用gcc编译;同理使用g++编译的静态库在生成目标程序链接的过程中也只能用g++编译。否则会报错"undefined reference to 'Fun1()'
- 用gcc编译目标程序时,main.c中可以不需要#include "lib.h",会报warning,但是不会报error;但是用g++编译时,一定要加 #include "lib.h",不然编译不通过,因此用g++编译的静态库,还需要它的所有头文件才能使用。
- 当你更改库文件的一些宏定义或者其他东西时,需要重新编译静态库,不然你的修改没有起作用。