1. 静态函数库
这类库的名字一般是 libxxx.a ;利用静态函数库编译成的文件比较大,因为整个 函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了。当然这也会成为他的缺点,因为 如果静态函数库改变了,那么你的程序必须重新编译 。
Linux下静态链接库的使用和建立
例程:quick_sort.c shell_sort.c quick_sort.h shell_sort.h main.c
具体文件代码见快速排序中的相应文件。
第一步:gcc -c quick_sort.c shell_sort.c生产链接文件,表示和.h已经链接好了quick_sort.o shell_sort.o
第二步:静态函数库的创建 ar 命了创建。
ar cr libmy_sort.a quick_sort.o shell_sort.o
-c : create 的意思
-r :replace 的意思,表示当插入的模块名已经在库中存在,则替换同名的模块。如果若干模块中有一个模块在库中不存在,ar 显示一个错误消息,并不替换其他同名模块。
-s: 代表若归档文件中包含了对象模式(C++) 。
libmy_sort: lib表示库,my_sort表示自己建立的库的名字。
第三步:使用静态库
gcc –Wall -o main main.c -L. -lmy_sort
生产的mian执行文件已经将静态链接库全部包含在里面,就可以直接运行了。
静态库制作完了,如何使用它内部的函数呢?只需要在使用到这些公用函数的源程序中包含这些公用函数的原型声明,然后在用gcc命令生成目标文件时指明静态库名(是mymath 而不是libmymath.a ),gcc将会从静态库中将公用函数连接到目标文件中。注意,gcc会在静态库名前加上前缀lib,然后追加扩展名.a得到的静态库文件名来查找静态库文件。
2. 动态函数库
Linux下动态链接库的使用和建立
第一步:创建:
动态库文件名命名规范和静态库文件名命名规范类似,也是在动态库名增加前缀lib,但其文件扩展名为.so。
gcc -shared -fPCI -o libmy_sort.so quick_sort.o shell_sort.o
第二步:使用
gcc –Wall -o main main.c -L. -lmy_sort
执行文件知道了执行的时候要去找-lmy_sort
./main
出现错误,./main: error while loading shared libraries:libmymath.so: cannotopen shared object file: No such file or directory
这是由于在运行main的时候,其要去找链接库-lmy_sort,一般都是去/lib-->/usr/lib-->/usr/local/lib这几个中寻找的,,找不到就会出现错误,不能执行,这个时候就要将文件libmy_sort.so复制到目录/usr/lib中:
cp libmy_sort.so /usr/lib
或者改变环境变量,将默认路径转换成我们自己定义的路径。
(这一部分后续有待增加)
gcc -Wall -o main main.c -I /home/share/quick/ -L/home/share/include/ -lmy_sort
gcc -Wall -o main main.c -I /home/share/quick/ -L/home/share/include/ -lmy_sort
-Wall 打开gcc的所有警告
gcc -I -L -l的区别:
gcc -o hello hello.c -I/home/hello/include -L /home/hello/lib -lworld
上面这句表示在编译main.c时-I /home/share/quick/表示将/home/share/quick/目录作为第一个寻找头文件的目录,
寻找的顺序是:/home/share/quick/-->/usr/include-->/usr/local/include
-L /home/share/include/表示将/home/share/include/目录作为第一个寻找库文件的目录,
寻找的顺序是:/home/share/include/-->/lib-->/usr/lib-->/usr/local/lib
-lmy_sort表示在上面的lib的路径中寻找-lmy_sort.so动态库文件(如果gcc编译选项中加入了“-static”表示寻找-lmy_sort.a静态库文件)