目录
一.静态库
1. 创建静态库
a.分步制作静态库
静态库制作:原文件–>.o文件–>.a文件
- 先将原文件.c 通过汇编命令生成
gcc -c xx.c -o xx.o
- 将许多个.o文件通过ar命令
ar -rc libxx.a xx1.o xx2.o
打包成为libxx.a
的静态库
-
编写代码
-
将原文件通过汇编命令生成目标文件
-
将.o可重定向目标文件打包成为静态库
ar
:archive静态库文件的格式:需要以
lib
开头,后缀为.a
。形如libxx.a
b.使用makefile
使用makefile,生成并整理(发布,make test)头文件和库文件
2. 使用静态库
- 编写一个带main函数的.c文件演示使用静态库
a. 安装自己的库
拷贝库到系统默认路径下的操作,叫做库的安装
- 对于系统或者语言的库,会放在系统的默认路径下
对于头文件gcc的默认搜索路径是:
/usr/include
对于库文件的默认搜索路径是:
/lib64
or/usr/lib64
- 拷贝到系统路径下
- gcc,默认使用的是c语言的静态库libc.a
即使我们将我们自己写的libmy.a放到系统路径下了,仍然属于第三方库,需要手动选择链接
- 使用选项:
-l+库名
,使用自己的静态库
- 卸载库,从系统路径下删除
b. 使用gcc的选项
-
-I
:除了系统和当前路径,增加一个指定路径进行搜索头文件
-
-L
:在指定路径下找库
二.动态库
1. 创建动态库
a.分步制作动态库
-
编写代码
-
汇编生成目标文件
动态库是运行时使用,所有编译的目标文件是相对的地址编码,使用
-fPIC
- 生成动态库
动态库也需要以
lib
开头,后缀为.so
。形如:libxx.so
b. makefile
使用makefile,生成并整理(发布)头文件和库文件
为将动、静态库区分,动态库的.o文件名有一个_d
2. 使用动态库
-
编写一个带main函数的.c文件演示使用静态库
-
编译
-
运行
可以发现在上文中对应静态库的编译也是:gcc main.c -I output/include -L output/lib -lmy
的形式。
此时output/lib
中有两个库文件,一个静态库libmy.a
、一个动态库libmy.so
。
由上图运行结构可以发现-lmy
链接的是动态库
- 动静态库使用规则是:
- 如果路径下只有静态库,gcc则只能针对该库进行静态链接
- 如果动静态库都有,默认使用的是动态库
- 如果指明
-static
则只使用静态库
由于报错是
not found
,是由于./a.out
运行时无法找到动态库
a. 添加路径到环境变量中
有一个环境变量LD_LIBARAY_PATH
,存放着程序运行时,加载(load)的库(library)的路径(path)。
我们可以添加自己动态库的绝对路径到当前运行环境中的LD_LIBARAY_PATH中
在当前运行环境下,使用export添加的环境变量,当退出重进后会清除的。因此需要每次登陆后需要运行时,再手动export添加一次
b. 添加路径到配置文件中
和上述的环境变量差不多,只不过每次重写登陆后,放在配置文件中的动态库的绝对路径还在,每次都能使用该动态库
c. 将动态库的软连接放在系统路径下
该方法貌似是最简单的
🦀🦀观看~