库是一个二进制文件,是将xx.c(main)文件编译生成的二进制文件,库分为动态库和静态
window:
静态库 xxx.lib
动态库 xxx.dll
linux:
静态库 libxxx.a
动态库 libxxx.so
静态库是lib库名.a格式的文件,如果在编译的时候需要使用静态库,会将静态库中的函数编译到可执行程序中,
可执行程序的体积比较大,效率会比较高。静态库更新后,需要重新编译可执行程序,否则可执行程序中拿不到最新的库中的函数(更新麻烦)。
gcc -c add.c -o add.o //只编译不连
ar -cr libadd.a add.o //ar制作静态库的命令, -c 创建静态库 -r把函数放到库中
- -l :链接库 (link)
- -L :指定库的路径 (Library)
- -I :指定头文件的路径 (include)
add.h
- #ifndef __ADD_H__
- #define __ADD_H__
-
- int add(int ,int);
-
- #endif
add.c ====>libadd.a
- int add(int a,int b)
- {
- return (a+b);
- }
main.c
- #include
- #include
- int main(int argc,const char * argv[])
- {
- int sum;
- sum = add(100,200);
- printf("sum = %d\n",sum);
- return 0;
- }
动态库在使用的时候只是将库中的函数的符号表放到了可执行程序中,所以可执行程序的体积比较小,在可执行程序运行的时候还需要依赖动态库文件。所以动态库的效率比较低,但是动态库更新方便。所以动态库在系统中用的地方非常的多。动态库又叫共享库
gcc -c -fPIC add.c -o add.o //将add.c只编译不链接生成add.o -fPIC忽略文件位置
gcc -shared add.o -o libadd.so //将add.o编译生成共享库
或
gcc -fPIC -shared add.c -o libadd.so //直接将add.c编译生成libadd.so库文件
- -l :链接库 (link)
- -L :指定库的路径 (Library)
- -I :指定头文件的路径 (include)
- export LD_LIBRARY_PATH=../lib/
- // 指定库的路径,只对当前终端生效
将自己的编译好的libadd.so库放到系统的库的路径下即可。
修改系统的库的配置文件
sudo vi /etc/ld.so.conf.d/libc.conf
执行sudo ldconfig让配置文件生效
add.h
- #ifndef __ADD_H__
- #define __ADD_H__
-
- int add(int ,int);
-
- #endif
add.c ====>libadd.so
- int add(int a,int b)
- {
- return (a+b);
- }
main.c
- #include
- #include
- int main(int argc,const char * argv[])
- {
- int sum;
- sum = add(100,200);
- printf("sum = %d\n",sum);
- return 0;
- }