江西网站制作公司,wordpress进入不了后台,网站建设系统多少钱,张家界直播视频一.动静态库的理解。
1.什么是库#xff1f; 代码是无穷无尽的#xff0c;当程序猿在写一些项目时#xff0c;未必所有代码亲历亲为#xff0c;他们可以在网上寻找大佬写过的一些有关需求的代码#xff0c;这些代码可以让他们拿过来直接使用#xff0c;而省去了许多精力…一.动静态库的理解。
1.什么是库 代码是无穷无尽的当程序猿在写一些项目时未必所有代码亲历亲为他们可以在网上寻找大佬写过的一些有关需求的代码这些代码可以让他们拿过来直接使用而省去了许多精力。把一些代码进行打包形成的便是库了。 上面所说库就是将代码进行打包。这个说法是方便读者理解而所说的。要想进一步的理解库我们要对程序的编译过程进行简单理解。
程序的编译有四道工序预处理编译汇编链接。
预处理头文件展开去注释条件编译宏替换。.c-.i
编译将代码编译为汇编代码。.i-.s
汇编将汇编代码转为可重定位的二进制文件。.s-.o
链接链接库文件形成可执行程序。.o-exe 库文件便是.o文件的集合当程序猿拥有了.o文件每次复用这些代码就不需要从头开始编译只需要拥有这些.o文件和对应的头文件就可以轻松的使用别人的代码在自己的.c文件中包头文件编译时进行库的链接。 2.动静态库的区别
静态库以拷贝的方式将方法的集合库直接拷贝到可执行程序中。
动态库以动态链接的方式将要链接的库函数地址拷贝到可执行程序中。 静态库将方法的集合库直接拷贝可执行程序中就决定了这个可执行程序在运行的时候不再需要库文件可以在随意运行但把库直接拷贝到可执行程序当中会导致可执行程序体积巨大。 动态库相较于静态库更加灵活可以做到一库同时被多个可执行程序使用每个可执行程序内部只有库函数的地址并不是将整个库内置入可执行程序中让可执行程序体积小巧。 在linux系统中静态库后缀为.a 动态库后缀为.so
在windows系统中 静态库后缀为.lib 动态库后缀为.dll
二.动静态库的制作和使用。
接下来亲手制作动静态库来感受
静态库的制作和使用
我们将要制作一个简易的math库库中包含加减乘除四种方法。在main.c中调用这些方法。 我们将mathlib文件夹中的.c文件全部编译为.o二进制文件 .c文件已经没用了删除 现在这个mathlib文件夹中只有头文件和二进制.o文件了我们将所有.o文件打包形成静态库使用命令:
ar -rc libmath.a *.o //将所有.o二进制文件打包形成math静态库 库已经制作完毕将所有.o文件删除 现在mathlib文件夹中仅有静态库和头文件了。下面尝试编译main.c 这里涉及gcc编译时的一些选项 动态库的制作和使用
动态库的制作和静态库的制作在.o文件打包之前完全相同在.o文件打包形成动态库的时候改为gcc的命令
gcc -shared -o libmath.so *.o
编译时和静态库做法也相同
只不过在运行可执行程序时会报错原因是没有将可执行程序和动态库建立动态链接。 下面提供多种动态链接的方法 1.将动态库拷贝到系统库目录/usr/lib64中运行时默认会在这里查找需要的库 2.将动态库拷贝到可执行程序所在的目录 运行时默认会在当前目录查找需要的库 3.建立软链接(在当前目录或者/usr/lib64目录) ln -s lib/mathlib.so mathlib.so 4.设置环境变量LD_LIBRARY_PATH默认会在这个环境变量里查找需要的库 5.创建系统关于动态库的配置文件 touch /etc/ld.so.conf.d/dy.conf 然后在新建的配置文件中添加动态库的绝对路径。