一个库主要包含一批头文件和一个或多个源文件。头文件包含函数声明,源文件包含函数实现。
动态库: 在Linux下是后缀为.so文件,在Windows下是后缀为.dll文件。多个程序可以共享使用动态库代码。
静态库: 在Linux下是后缀为.a的文件,在Windows下是后缀为.lib的文件。
动态链接: 在可执行程序运行前,操作系统将使用到动态库的机器码从硬盘加载到内存中。
静态链接: 可执行程序编译链接时,将代码使用到的静态库的代码拷贝到可执行程序中。静态链接的本质是将使用到的代码链接。
静态链接和动态链接的优缺点:
静态链接: 可执行程序文件体积大,但是不依赖库,可移植性强。
动态链接: 库执行程序文件体积小,但是依赖库,如果库被删除,该程序也无法使用。
第一步 编写源代码文件和头文件
写一个静态库需要头文件和能生成目标文件的文件。
编写你的库函数的源代码文件(例如 add.c)和相应的头文件(例如 add.h)。
add.h
add.c
第二步 生成目标文件
使用编译器将源代码文件编译成目标文件(.o 文件)。
第三步 打包生成静态库
使用 ar 工具将目标文件打包成静态库。
ar: GNU归档工具。
rc: 选项用于替换(replace)和创建(create)归档文件,并生成索引(symbol table)。
libmymath.a: 静态库文件名。
此步骤将生成名为 libmymath.a 的静态库。
- 定义静态库: 第一行指定静态库名称为libadd.a。
- 构建规则: 第3行定义构建规则,表明静态库依赖于myadd.o,第4行实际构建静态库的命令。
- 编译规则: 第5-6行定义了编译myadd.o的规则,依赖于add.c,使用gcc编译。
- 清理规则: 第8-10行定义了清理规则,用于删除生成的目标文件和静态库。
- 输出目录规则: 第12-17行定义了输出目录结构的规则,包括创建目录和复制文件
1. 编写一个使用静态库的程序 main_static.c
2. 编译使用静态库的程序
使用 gcc 编译程序并链接静态库。
-I https://blog.csdn.net/yualian/article/details/lib/include/: 告诉编译器在 https://blog.csdn.net/yualian/article/details/lib/include/ 目录下查找头文件。
-L https://blog.csdn.net/yualian/article/details/lib/myaddlib/: 告诉编译器在 https://blog.csdn.net/yualian/article/details/lib/myaddlib/ 目录下查找库文件。
-ladd: 指定链接时使用的库名,编译器会在指定的库目录中找到 libadd.a。
可以使用软连接方式把头文件和库文件添加在默认搜索路径上
(/usr/include、/usr/lib64)。
添加后直接使用运行指令
第一步 生成目标文件
使用 -fPIC 选项生成位置独立的目标文件
-fPIC: 生成位置独立的代码。
第二步 生成动态库
使用 -shared 选项生成动态库。
-shared: 生成动态共享库。
libmymath.so: 动态库文件名。
第三步 生成动态库
使用 -shared 选项生成动态库。
-shared: 生成动态共享库。
1. 编写一个使用动态库的程序 main_static.c
2. 加载动态库
方法1: 拷贝到系统默认的库路径
首先,我们需要将自定义库文件拷贝到系统默认的库路径中。假设你的库文件位于 /home/my/libadd.so
这将把你的库文件复制到 /usr/lib64/ 目录下。
方法2: 在系统默认库路径下建立软链接
创建一个软链接,将库文件链接到 /lib64/ 目录中。
这将在 /lib64/ 目录下创建一个名为 libadd.so 的软链接。
方法3: 将库路径添加到LD_LIBRARY_PATH
将自定义库的路径添加到系统环境变量 LD_LIBRARY_PATH 中。
你也可以将上述命令添加到你的 shell 配置文件中(例如 ~/.bashrc 或 ~/.zshrc),以便每次打开终端时都自动设置。
方法4: 配置 /etc/ld.so.conf.d/
创建一个配置文件,告诉系统在哪里查找动态库。
在文件中添加你库文件所在的路径,例如:
这将更新系统动态链接器的运行时链接库缓存。
现在,你的自定义库应该能够在系统中被正确找到和使用了。你可以编译和运行程序而无需手动指定库文件的路径。
到此这篇动态库和静态库的后缀(动态库文件和静态库文件)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/hd-yjs/72530.html