学习视频链接:
黑马程序员-Linux系统编程_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1KE411q7ee?p=28
「操作系统」编译,链接,装载_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1xr4y1A7Vm?spm_id_from=333.337.header_right.fav_list.click
说明:
文章中的一部分文件创建涉及到上一个文章
目录
一、动态库和静态库
1.1 简介
1.2 静态库和动态库 (共享库) 的区别
二、静态库
2.1 简介
2.2 创建静态库
2.3 生成静态库代码
三、动态库
3.1 编译、链接、装载
3.2 反汇编命令,可以查看汇编代码(分析编译后的代码)
3.3 生成动态库代码
3.4 永久修改环境变量配置文件
3.5 使用绝对路径编写
3.6 其他的配置环境变量的方法
所谓 “程序库”,简单说,就是包含了数据和执行码的文件。其不能单独执行,可以作为其它执行程序的一部分来完成某些功能。库的存在,可以使得程序模块化,可以加快程序的再编译,可以实现代码重用,可以使得程序便于升级。程序库可分静态库 (static library) 和共享库 (shared object) 。
可执行文件如果想要使用静态库必须得在可执行文件里面包含静态库,如果静态库有 5M 大小,100 个可执行文件就包含了 500 M 大小的静态库内容。
如果想执行动态库,把动态库加载到内存中,其他的可执行文件可以直接去用它。
动态库内存开销比较小,但是运行速度没有静态库快 (现在速度差距已经很小了)
而静态库一般用在对空间要求较低,而时间要求较高的核心程序中。
(1) 静态库可以认为是一些目标代码的集合。按照习惯,一般以 “.a” 做为文件后缀名。使用ar (archiver) 命令可以创建静态库。因为共享库有着更大的优势,静态库已经不经常使用。但静态库使用简单,仍有使用的余地,并会一直存在。有些 Unix 系统,如 Solaris 10,已经基本废弃了静态库。
(2) 静态库在应用程序生成时,可以不必再编译,节省再编译时间。但在编译器越来越快的今天,这一点似乎已不重要。如果其他开发人员要使用你的程序,而你又不想给其源码,提供静态库是一种选择。从理论上讲,应用程序使用了静态库,要比使用动态加载库速度快 1-5%,但实际上可能并非如此。由此看来,除了使用方便外,静态库可能并非一种好的选择。
ar rcs libmylib.a file1.o
静态库创建成功后,需要链接到应用程序中使用。使用 gcc 的 -l 选项来指定静态库,使用 -L 参数来指定库文件的搜索路径。所有库文件名都以 lib 开头,开头的 lib 在指定参数时应省略。-l 和 -L 之后都直接带参数而不跟空格
1、生成静态库
2、测试静态库
3、警告中说 隐式声明(函数没有声明和定义编译器会帮你做隐式声明)方面有一些问题
怎么解决这样的问题呢?
4、我们拿到别人的项目不一定会知道函数原型,所以写声明的方法再实际中不太可行。一般编写库的人会写一个头文件
5、项目管理:
编译 .c —> .o
链接 小模块.o —> 大模块.exe
装载 .exe 放入内存中
链接阶段不确定动态库文件在 .exe 中的逻辑地址,在装载到程序以后,运行程序的时候,访问动态库的内容
objdump -ds test > out
1、代码
# 1、将.c生成.o文件,(生成与位置无关的代码-fPIC) gcc -c add.c -o add.o -fPIC # 2、使用 gcc -shared 制作动态库 gcc -shared lib库名.so add.o sub.o div.o # 3、编译可执行程序时,指定所使用的动态库。-l: 指定库名 -L: 指定库路径 gcc test.c -o a.out -l mymath -L ./lib 4.运行可以执行程序 ./a.out 出错!!! 原因 连接器 工作于链接阶段,工作时需要 -l 和 -L 动态连接器 工作于程序运行阶段,工作时需要提供动态库所在目录位置 5、解决:把动态库配置到环境变量中 (建议使用绝对路径) export LD_LIBRARY_PATH=./lib
报错了:在加载动态库的时候出错了,库名叫 libmymath.so,不能打开共享文件,没有这个文件或者目录
2、把动态库配置到环境变量中
新开一个窗口就失效了,要永久配置环境变量需要修改配置文件
先跳转到家目录下,再打开隐藏的配置文件
添加这一句话
sudo sp libmymath.so /lib