目录
一、概要
.c文件被打包成库,库需要分发给使用者。
main.c包含.h文件,调用.h文件中的接口;接口的定义在.c文件中,.c文件被打包成库。
main.c编译为可执行文件app,链接的过程需要头文件(.h)和库文件的信息——头文件的地址、库文件的名称和地址。
动态库和静态库的区别在链接阶段:gcc main.c -o app -I ./include -l calc -L ./lib
静态库被打包到可执行程序中,可直接使用;
动态库需要配置绝对路径,动态加载到内存中
二、静态库
命名规则:
Linux静态库命名规则: libxxxx.a
windows静态库命名规则: libxxxx.lib
静态库制作:
首先,生成 .o文件:gcc -c add.c div.c mult.c sub.c
然后,生成静态库:ar rcs libcalc.a add.o sub.o mult.o div.o
静态库的使用:
命令:
复制: cp -r calc/ library ../lesson05 //复制文件夹,使用-r,递归复制
cp ../calc/libcalc.a ./lib
返回上一级目录: cd ..
删除所有 .o文件: rm *.o
重要说明:
include:头文件
lib:库文件
src:源文件
head.h包含函数声明;src中是源文件,包含函数定义,源文件变成.o文件,然后被连接成libcalc.a库;所以head.h可以理解为库的使用说明
编译main.c为app,要包含头文件head.h和库文件
使用:
gcc main.c -o app -I ./include -l calc -L ./lib
说明:
gcc main.c -o app
-I(大写的i;头文件地址) ./include
-l(小写的l) calc(库的名称,不包含前缀后缀)
-L(库的地址) ./lib
执行文件:./app
三、动态库
命名规则:
Linux:libxxx.so
windows:libxxx.dll
动态库的制作:
lesson05$ cp -r calc library ../lesson06
gcc -fpic生成位置无关的代码:calc$ gcc -c -fpic add.c div.c mult.c sub.c
gcc 得到动态库: calc$ gcc -shared add.o div.o mult.o sub.o -o libcalc.so
动态库的使用:
将动态库复制到library目录下:library$ cp ../calc/libcalc.so ./lib
library$ gcc main.c -o main -I ./include -L ./lib -l calc ,报错
方法一:配置LD_LIBRARY_PATH 库的绝对路径
1.在终端中配置
命令:
检查文件的动态库依赖关系:ldd main
命令:env 查看环境
命令:pwd 获取当前路径
插入路径:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/chen/Linux/lesson06/library/lib
说明:
$获取当前路径
:在其后添加路径
=两边不能有空格
查看路径:
echo $LD_LIBRARY_PATH
ldd
在终端中配置的路径是临时的
2.用户级别
步骤:
进入根目录 :cd
vim .bashrc
shift+g 跳到最后一行
o 插入,插入内容:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/chen/Linux/lesson06/library/lib
保存并退出
使更新生效:source .bashrc 或 . .bashrc
删除路径:vim ~/.bashrc // ~/ 什么意思
编辑.bashrc,删除路径
使更新生效:source .bashrc
3.系统级别
sudo vim /etc/profile
其它操作与用户级别相同。
使更新生效:source /etc/profile
方法二:配置/etc/ld.so.cache
ls /ll + 文件路径
ls /etc/ld.so.cache
sudo vim /etc/ld.so.conf
将路径加入:/home/chen/Linux/lesson06/library/lib
完成