库文件:特定功能的实现,为用户提供一些调用接口
libc
: printf scanf malloc free
stdio.h malloc.h 函数声明
编译
连接 符号解析 找到符号对应的定义位置
数据结构
顺序表 链表 队列 栈 二叉树
C++ STL标准模板库 容器
1、静态库,动态库在Windows和Linux下的区别:
静态库 动态库
Windows .lib .dll
Linux .a .so
静态库
1、 功能代码编译成中间文件
gcc –c *.c --> *.o
2、命令 ar
ar crv libxxx.a *.o
3、使用
gcc -o main main.c -L库的存储路径 -l库文件的名称
共享库(动态库)
1、 生成共享库
gcc -shared -fPIC –o libxxxx.so 源文件列表
2、 使用
gcc -o main main.c -L库的存储路径 -l文件的名称(与静态库相同)
区别:
(1) 静态库类似于中间文件的集合,是不可执行的,
共享库是一个不可执行的可执行文件
(2) 静态库是在连接时,将静态库中的内容合并到最终的可执行文件中,所以程序执行时,不需要依赖静态库。
动态库是在程序运行时,由操作系统加载库文件到内存上去执行,最终生成的程序中根本没有库文件中的内容
(3) 更新库中的功能,如果是静态库,必须重新编译可执行文件
如果是共享库,只需要更新共享库就可以。
3、 通过LD_LIBRARY_PATH环境变量给操作系统指定加载共享库的路径
(1)直接在终端上修改 export LD_LIBRARY_PATH=库的路径:.
仅对当前终端有效,当终端关闭或者系统重启,则设置的环境变量就不存在了
(2)修改配置文件 /etc/bashrc
Export LD_LIBRARY_PATH=库的路径:.
(3) 将生成的共享库存储到系统默认的搜索路径下 /lib /usr/lib
Linux中利用静态库和动态库对代码的实现
静态库 共享库
MyMath.h List.h 函数的声明
MyMath.c List.c 函数的实现
main.c 测试主函数
静态库:
-
gcc -c List.c MyMath.c 生成中间文件
List.o MyMath.o -
ar crv libxxxx.a List.o MyMath.o
---->libxxx.a 静态库 -
gcc -o main main.c -L. -lxxxx
----> main./main
命令:
touch MyMath.c MyMath.h
vim MyMath.c
vim MyMath.h
gcc -c MyMath.c 生成中间文件mymath.o
vim main.c
ar cro libMyMath.a *.o 创建一个libMyMath.a文件
gcc -o main main.c -L -lMyMath 生成一个main文件
./main ----->得出main中的运算结果
动态库(共享库):
- gcc –shared –fPIC –o libxxx.so MyMath.c List.c
----> libxxxx.so 动态库 - gcc -o main main.c -L. –lxxxx
----> main - 修改环境变量
export LD_LIBRARY_PATH=.
./main
命令:
mkdir so 创建so目录文件
ls
cp *.c *.h so
cd so 进入so目录文件
gcc –shared -fPIC –o libMyMath.so MyMath.c 生成libMyMath.so文件
ll 查看文件大小
./libMyMath.so 执行libMyMath.so文件中的内容
记忆体区段错误
(注:libMyMath.so文件是一个不可执行的可执行文件,所以需与main文件联系起来)
gcc -o main mian.c -L. –lMyMath 生成main文件
./main 执行main 中的内容
(会出现如上的错误,需对环境变量进行修改)
export LD_LIBRARY_PATH=. 修改环境变量
./main 执行main文件
cd .. 从so目录文件中退出