Linux之动态/静态库

11 篇文章 0 订阅

今天讲一下关于动静态库的生成和使用:
编写简单的加减乘除运算函数并打包成动/静态库,并分别使用
我将加减生成的是静态库,乘除生成的是动态库。
c/c++程序编译的过程:
1.预处理 :展开头文件,宏定义,条件编译处理等。通过gcc -E source.c -o source.i
2.编译:这里是一个狭义编译意义,指的是将预处理后的文件翻译成汇编代码的过程。通过gcc -S source.i生成,默认生成source.s文件。
3.汇编:汇编是将上一步生成的汇编代码翻译成相对应的二进制机器代码的过程。通过gcc -c source.s来生成source.o文件
4.链接:链接是将生成的目标文件和其引用的各种符号生成一个完整的可执行程序的过程。链接的时候会进行虚拟内存的重定向操作。
第四步链接要复杂一些,很多时候我们在编译比较大的项目,报错的往往是在链接的时候少了某些库,这就需要用到我们后面讲的库。

1.动态库
这类库的名字一般是libxxx.M.N.so,同样的xxx为库的名字,M是库的主版本号,N是库的副版本号,当然也可以不要版本号,但名字必须有,相对于静态函数库,动态函数库在编译的时候并没有被编译进代码中,你的程序执行到相关函数时才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。由于函数库没有被整合进你的程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。

动态库的生成:在这里插入图片描述
例如要生成上面的libmnd.so动态库,则需要下面的指令:
gcc -fPIC -c mnd.c -o mnd.o 因为乘除函数是写在mnd.c文件里的
-fPIC表示生成位置无关代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码共享的目的。
gcc --share mnd.o -o libmnd.so
–share该选项指定生成动态连接库,不用该标志外部程序无法连接,相当于一个可执行文件。
之后就会生成一个动态库文件如上图显示的libmnd.so
那生成动态库后我们就要链接使用它,执行程序如下:
我们在这里采用设置环境变量的方式:
在这里插入图片描述
export LIBRARY_PATH = . LIBRARY_PATH:库文件的链接搜索路径
export LD_LIBRARY_PATH = . LD_LIBRARY_PATH:库文件的运行加载路径
当然使用export指令设置的环境变量只是临时有效的!
然后再执行下面这个指令
gcc main1.c -o main1 -lmnd -l:指定要链接的库名称
然后./main1运行结果如下:
在这里插入图片描述
2.静态库
静态函数库实际上就是简单的一个普通的目标文件的集合,一般来说习惯用“.a”作为文件的后缀,可以用ar这个程序来产生静态函数库文件, 静态库的代码在编译过程中已经被载入可执行程序,因此生成的可执行程序体积较大。
生成静态库:
gcc -c ans.c -o ans.o
ans.c文件里写的是加减函数
ar -cr libmymath.a ans.o
-c 创建 -r 模块替换
在这里我将生成的libmymath.a静态库文件放在了当前路径下的ib目录里
在这里插入图片描述
然后就是链接使用静态库了,需要只执行下面代码:
gcc main.c -o main -I . -L ./lib -lmymath
-I:指定头文件搜索路径 -L:指定库的链接搜索路径,所以应该是./lib -l:指定要连接的库名称
之后再运行程序./main,结果如下:
在这里插入图片描述
到这里基本的动态静态库的代码实例演示就讲完了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值