基础知识:动vs静
类型 | 动 | 静 |
---|---|---|
加载时机 | 运行时 | 编译时 |
可复用性 | 多个文件只需要加载一份库文件 | 每个文件都需要加载一份文件 |
性能 | 链接次数越多越有优势 | 链接次数越少越有优势 |
代码编写
静态库
生成静态库
Bash
libmath.a:add.o sub.o
ar -rc $@ $^
%.o:%.c
gcc -c $<
使用静态库
头文件和工作目录同目录
- 将
头文件,库文件
放到文件需要使用的目录下
cpp
#include<stdio.h>
#include"add.h"
#include"sub.h"
int main()
{
printf("%d\n",add(1,2));
printf("%d\n",sub(1,2));
return 0;
}
头文件放到工作目录下
- 指明库文件的位置
头文件和工作目录不同目录
只要能指明头文件路径就可以使用
cpp
#include<stdio.h>
#include"dy/add.h"
#include"dy/sub.h"
int main()
{
printf("%d\n",add(1,2));
printf("%d\n",sub(1,2));
return 0;
}
动态库
生成动态库
bash
libmath.so:add.o sub.o
gcc -shared -o $@ $^
%.o:%.c
# gcc -c $^ -o $@
gcc -fPIC -c $<
fPIC
与位置无关码
使用动态库
- 将
头文件,库文件
放到文件需要使用的目录下 - 生成可执行文件
原因解释
-I(大写i)------如果头文件不在目录下,会报错;这个命令告诉编译器头文件位置
-L------库文件位置
-l(小写L)------库文件名称
直接写明是告诉编译器怎么做,在运行的时候是告诉系统库文件的位置------需要在系统上设置库文件的位置
指明库文件位置的方法
- 直接将
头文件+库文件
添加进系统目录
下
头文件
------/usr/include/
库文件
------/lib64
- 在
系统目录
下添加软链接
ln -s 目标库文件 新增软连接
修改LD_LIBRARY_PATH
变量
unset
删除变量内容------ unset PATH使用
:
将地址进行分割
export
设置环境变量------ export PATH=...
- 在
/etc/ld.so.conf.d/
目录下创建文件
------永久有效
使用
ldconfig
进行刷新,必要时使用sudo