目录
前言
库文件就是将已经实现的代码打包,生成的不是可执行程序,而是个别人提供的接口。
静态库
静态链接:生成可执行文件时链接静态库,直接将库中所用的函数实现,拿到可执行程序中,不存在运行依赖,效率高,但是生成的可执行文件较大,如果运行多个用到同一个静态库的程序则会出现代码在内存中有大量冗余。
生成静态库
1.先把所有的原码进行编译汇编生成各自的二进制指令:
例如: gcc add.c -o add.o
但这样写在linux下编译时会报错
问题在于以上代码中没有main函数,但是编译器认为我的程序为可执行的程序,修改方法添加“-c”,表示不去链接为可执行程序,只需编译为.o文件
可以看到加了 -c后就成功了,目录下多了一个add.o文件
2.把所有生成的二进制文件打包在一起
例如:ar -cr libmyadd.a add.o
上面的libmyadd.a是生成的库, .a是静态库后缀
动态库
动态链接:生成可执行程序时链接动态库,记录库中的符号表,生成的程序小,多个程序运行时可以共享使用同一个动态库,运行时会依赖动态库的存在(运行程序时才会将动态库加载到内存中)。
生成动态库
步骤和上面一样
1. gcc -FPIC -c add.c -o add.o
-FPIC是在编译生成指令时,产生与位置无关的代码
为了和静态库区别,使用了add2,可以看到生成成功了
2. gcc --shared add.o -o add.so
.so是动态库后缀
生成成功了
使用库
使用-l 来告诉编译器要使用哪个库
例如 : gcc main.c -o main -llibmyadd.a
但是会报错
因为编译器会回到指定目录下(/usr/lib64)查找这个文件
所以解决方法:
1.将库文件放到指定路径下:64位系统——/usr/lib64 ;32位:——/usr/lib
2.设置环境变量:
export LIBRARY_PATH=${LIBRARY_PATH}../ 将库文件所在目录添加到环境变量中
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}../ 添加运行加载库文件路径
注意:动态库与静态库同时存在时,gcc优先链接动态库。
3.使用gcc -L 选项,指定库文件所在路径: gcc main .c -o main -L./ -llibmyadd.a
使用这种方式只适用于在指定路径下,链接静态库后,因为无法设置运行程序时的库加载路径。