网站推广app下载,上海最近新闻,陆川建设局网站,qq交流群功能介绍1.库是什么#xff0c;作用是什么
库是写好的#xff0c;现有的可以复用的代码。现实中每个程序都要依赖很多基础的底层库#xff0c;不可能每个人的代码都从零开始。
本质上来说库是一种可执行代码的二进制形式#xff0c;可以被操作系统载入内存中执行。库有两种#…1.库是什么作用是什么
库是写好的现有的可以复用的代码。现实中每个程序都要依赖很多基础的底层库不可能每个人的代码都从零开始。
本质上来说库是一种可执行代码的二进制形式可以被操作系统载入内存中执行。库有两种 静态库后缀 .a (在linux下) .lib (在windows下) 动态库后缀 .so (在linux下) .dll (在windows下) 静态库
静态库 (.a)程序在编译链接的时候把库里的代码链接到可执行文件中链接完后静态库的代码就成为了目标文件的一部分如果多个程序使用同一个静态库那么每个程序都会包含一份该库的副本从而导致程序体积较大。然后程序运行的时候不再需要静态库了。 优点 独立性高 静态库在编译时直接嵌入到可执行文件中程序运行时无需依赖外部库文件减少了部署时的依赖问题。 执行效率高 代码在编译时已完全链接运行时无需加载外部库启动速度和执行效率通常更快。 部署简单 可执行文件是独立的无需额外分发或配置库文件适合嵌入式系统或封闭环境。 兼容性问题少 无需担心库版本与系统环境不匹配的问题。 缺点 文件体积大 每个可执行文件都包含库代码的副本占用更多磁盘和内存空间尤其是多个程序使用同一库时。 更新困难 库的更新需要重新编译整个程序维护成本高无法快速修复漏洞。 内存冗余 多个程序运行时相同库代码的多个副本会重复占用内存。 动态库
动态库(.so)程序运行时才去链接动态库的代码多个程序共享使用库的代码。
一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表而不是外部函数所在目标文件的整个机器码在运行前外部函数的机器码有操作系统从磁盘上的该动态库中赋值到内存中这个过程叫做动态链接。
动态库可以在多个程序间共享所以动态链接使可执行文件更小节省了磁盘空间。操作系统通过虚拟内存机制 允许物理内存中的一份动态库被所有用到该库的进程共用节省内存和磁盘空间。 优点 节省资源 多个程序共享同一动态库文件减少磁盘和内存占用。 更新便捷 替换动态库文件即可更新功能或修复漏洞无需重新编译程序。 支持运行时加载 可实现插件机制或延迟加载灵活扩展程序功能。 编译效率高 链接时仅记录引用编译速度较快尤其是大型项目。 缺点 依赖管理复杂 程序运行时需确保系统中存在正确版本的动态库否则会崩溃如“DLL地狱”。 性能略低 首次加载库时需要额外开销可能影响启动速度。 兼容性风险 若动态库接口或行为变更可能导致依赖它的程序异常需严格版本控制。 部署稍复杂 需确保目标环境已安装所需动态库或与程序一起分发。 2.动静态库的原理
一个源文件变为一个可执行文件需要四个步骤 1.预处理完成头文件展开、去注释、宏替换、条件编译等、最终形成xxx.i文件。 2.编译完成词法分析、语法分析、语义分析、符号汇总等。检查后将代码翻译成汇编指令最终形成xxx.s文件 3.汇编将汇编指令变为二进制指令、最终形成xxx.o文件。 4.链接将形成的各个xxx.o文件进行链接最终形成可执行程序。 我们将形成的.o文件打包起来。之后只需要链接这个包即可。这个包就是我们常说的库。
动静态库本质上就是一堆.o文件的集合。使用库只需要提供头文件给使用者。在编译程序时通过链接指定的库来实现对库中功能的调用。 3.动静态库的打包
四个文件分别是
add.c
#includeadd.h
int add(int x,int y)
{return xy;
}add.h
#pragma once int add(int x,int y);get_m.c
#includeget_m.h
int get_m(int a,int b)//return a的b次方
{int t1;while(b){ if(b1)//是奇数{ ta;//} aa*a;//自身的平方bb1;//} return t;
}get_m.h
#pragma onceint get_m(int a,int b);
静态库的打包
1.然后将这些.c文件生成.o文件 2.使用ar指令打包成对应的静态库。 使用格式 ar 选项 库名 打包文件名 关键的两个选项 -r(replace): 如果静态库文件当中的目标文件有更新则用新的目标文件替换就得目标文件 -c(create): 建立静态库文件 3.将头文件和生成的静态库组织起来。
把自己的库提供给他人使用时通常需要给予两个文件夹 一个文件夹存放头文件集合。即把所有的.h头文件放到一个目录下 一个文件夹存放所有的库文件。即把生成的.a文件存放到一个目录 4.使用静态库
我们使用自己打包的静态库在使用gcc进行编译时要有以下三个选项 -I(大写的i)指定头文件搜索路径。-L指定库文件搜索路径-l(小写的L)指明文件需要链接库文件路径下的哪一个库(注意libmath.a 我们只需-lmath即可 不需要加上lib 和 .a) 我们在命令行中指定头文件的搜索路径库文件的搜索路径以及具体使用哪个库 例如我们要执行main.c这个.c文件里使用了静态库中的两个函数。
#includestdio.h
#includeadd.h
#includeget_m.h int main()
{int a2;int b20;int resadd(a,b);int sumget_m(a,b);printf(%d\n,res);printf(%d\n,sum);return 0;
}上面三个选项都可以选的加空格和不加空格。
我们平时使用gcc之所以没带上这个三个选项是因为我们之前使用的库都默认在系统路径下编译器能准确识别这些存在于配置文件的路径如果我们将头文件和库文件拷贝到系统路径 /usr/include/lib.64 下 sudo cp libmath/include/* /usr/include/sudo cp libmath/lib/* /lib.64/ 这样只需要带 -l(小写的L) 指明链接库文件下具体哪个库。
但是不推荐这么做可能会污染系统文件。
动态库的打包
1.生成.o文件
区别于静态库需要加上 -fPIC选项(I为大写的i) 。 -fPIC 是一个非常重要的编译选项。它的作用是生成 位置无关代码 位置无关代码是一种特殊的代码它可以在内存中的任何位置运行而不需要修改代码本身。 动态库共享库会被多个程序共享并且在运行时加载到内存中。由于无法预知动态库会被加载到内存的哪个位置因此必须使用位置无关代码来确保动态库的正确运行。 为什么要使用 动态库在编译时无法确定其加载的内存地址因此必须使用位置无关代码。 如果不使用 -fPIC编译生成的代码可能会包含绝对地址导致动态库在加载时无法正确运行。 使用 -fPIC 可以确保动态库在内存中的任何位置都能正常运行。 2. 打包为动态库-shared选项
生成动态库不需要ar指令使用gcc编译加上-shared选项 (shared意为共享)。 3.将头文件和生成的动态库组织起来
将自己的库提供给他人使用时与静态库一样通常给予两个文件 将两个头文件放到一个目录 includeso中 生成的动态库文件libmath.so放到libso目录中 4. 动态库的使用
与静态库一样使用gcc编译带上三个选项 -I(大写的i)指定头文件搜索路径。-L指定库文件搜索路径-l(小写的L)指明文件需要链接库文件路径下的哪一个库(注意libmath.a 我们只需-lmath即可 不需要加上lib 和 .a) 指定头文件的搜索路径库文件的搜索路径以及具体使用哪个库。
依然是使用加法和快速幂函数
#includestdio.h
#includeadd.h
#includeget_m.h int main()
{int a2;int b20;int resadd(a,b);int sumget_m(a,b);printf(%d\n,res);printf(%d\n,sum);return 0;
}但是这个a.out 不能直接执行。
即使使用了-I -L -l 依然没找到对应的动态库 因为这三个选项只是在编译期间向编译器告知我们所使用的头文件和库文件的具体位置以及具体的库名。当可执行程序生成后就不再与编译器有直接的关系了所以依然找不到此程序所依赖的动态库。 为了解决这个问题 (1).将库文件拷贝到系统共享的库路径下 sudo cp ./lib/libmath.so /lib64 但是与上面的静态库一样可能会对系统文件造成污染一般不使用此方法。 (2).在系统共享路径建立同名软链接 sudo ln -s /home/pc/linuxplusplus/test39/libso/libmath.so /usr/lib/libmath.so (3).更改环境变量 LD_LIBRARY_PATH export LD_LIBRARY_PATH$LD_LIBRARY_PATH:/home/pc/linuxplusplus/test39/libso//(自己对应动态库所在路径) LD_LIBRARY_PATH是程序运行动态查找库时所要搜索的路径我们只需要将动态库所在目录路径添加到LD_LIBRARY_PATH环境变量中程序运行起来就能找到对应的路径下的动态库。但是环境变量会在重启时自动重置所以这种方法具有临时性。 (4)/etc/ld.so.conf.d/ 在系统中/etc/ld.so.conf.d/是用于搜索动态库的路径此路径下存放的全是后缀为.conf的配置文件这些配置文件中所存放的都是动态库的路径。 所以将自己的库文件也放在这路径下在可执行程序运行时系统就可以找到我们的库文件。这种行为是永久的不会因为重启改变。 将对应库文件地址写入一个.conf 文件中然后将其导入/etc/ld.so.conf.d/路径使用ldconfig指令更新以下配置文件就可以执行可执行文件了 4.动静态库的使用 ldd 文件名 可以查看一个可执行程序所依赖的库文件上面的libc.so.6就是该可执行程序所依赖的库文件实际是一个软链接这个软链接的原文件 libc-2.31.so 和libc.so.6在同一个目录下。 gcc与g编译器默认都是动态链接的如果非要静态链接就只能在后面 -static 一旦 -static就必须存在相应的静态库。没有安装可以使用下面指令进行安装
centOS下sudo yum install glibc-static
sudo yum install libstdc-staticunbento下sudo apt install glibc-static
sudo apt install libstdc-static 这篇就到这里啦再见(๑′ᴗ‵๑) Lᵒᵛᵉᵧₒᵤ❤ 文章转载自: http://www.morning.iknty.cn.gov.cn.iknty.cn http://www.morning.lkrmp.cn.gov.cn.lkrmp.cn http://www.morning.nzxdz.cn.gov.cn.nzxdz.cn http://www.morning.rltsx.cn.gov.cn.rltsx.cn http://www.morning.jfxth.cn.gov.cn.jfxth.cn http://www.morning.tfpbm.cn.gov.cn.tfpbm.cn http://www.morning.pluimers.cn.gov.cn.pluimers.cn http://www.morning.qkxt.cn.gov.cn.qkxt.cn http://www.morning.qrcxh.cn.gov.cn.qrcxh.cn http://www.morning.nbsfb.cn.gov.cn.nbsfb.cn http://www.morning.mqbdb.cn.gov.cn.mqbdb.cn http://www.morning.fdlyh.cn.gov.cn.fdlyh.cn http://www.morning.wfyzs.cn.gov.cn.wfyzs.cn http://www.morning.3jiax.cn.gov.cn.3jiax.cn http://www.morning.jpbky.cn.gov.cn.jpbky.cn http://www.morning.bxqpl.cn.gov.cn.bxqpl.cn http://www.morning.xmpbh.cn.gov.cn.xmpbh.cn http://www.morning.rmrcc.cn.gov.cn.rmrcc.cn http://www.morning.xbdd.cn.gov.cn.xbdd.cn http://www.morning.qlrwf.cn.gov.cn.qlrwf.cn http://www.morning.bfmrq.cn.gov.cn.bfmrq.cn http://www.morning.hbtarq.com.gov.cn.hbtarq.com http://www.morning.qlbmc.cn.gov.cn.qlbmc.cn http://www.morning.lwjlj.cn.gov.cn.lwjlj.cn http://www.morning.pzcjq.cn.gov.cn.pzcjq.cn http://www.morning.cttgj.cn.gov.cn.cttgj.cn http://www.morning.gxfzrb.com.gov.cn.gxfzrb.com http://www.morning.mtqqx.cn.gov.cn.mtqqx.cn http://www.morning.rgpsq.cn.gov.cn.rgpsq.cn http://www.morning.hyyxsc.cn.gov.cn.hyyxsc.cn http://www.morning.jkwwm.cn.gov.cn.jkwwm.cn http://www.morning.lmnbp.cn.gov.cn.lmnbp.cn http://www.morning.trqzk.cn.gov.cn.trqzk.cn http://www.morning.rjmd.cn.gov.cn.rjmd.cn http://www.morning.gkjnz.cn.gov.cn.gkjnz.cn http://www.morning.mhxlb.cn.gov.cn.mhxlb.cn http://www.morning.llthz.cn.gov.cn.llthz.cn http://www.morning.qkkmd.cn.gov.cn.qkkmd.cn http://www.morning.dkcpt.cn.gov.cn.dkcpt.cn http://www.morning.tlbhq.cn.gov.cn.tlbhq.cn http://www.morning.btcgq.cn.gov.cn.btcgq.cn http://www.morning.tntbs.cn.gov.cn.tntbs.cn http://www.morning.ngcbd.cn.gov.cn.ngcbd.cn http://www.morning.nfdty.cn.gov.cn.nfdty.cn http://www.morning.wkknm.cn.gov.cn.wkknm.cn http://www.morning.qzpw.cn.gov.cn.qzpw.cn http://www.morning.pqkgb.cn.gov.cn.pqkgb.cn http://www.morning.hhpkb.cn.gov.cn.hhpkb.cn http://www.morning.bpcf.cn.gov.cn.bpcf.cn http://www.morning.webife.com.gov.cn.webife.com http://www.morning.mqfhy.cn.gov.cn.mqfhy.cn http://www.morning.qtltg.cn.gov.cn.qtltg.cn http://www.morning.pghfy.cn.gov.cn.pghfy.cn http://www.morning.kxltf.cn.gov.cn.kxltf.cn http://www.morning.csjps.cn.gov.cn.csjps.cn http://www.morning.kcfnp.cn.gov.cn.kcfnp.cn http://www.morning.gbljq.cn.gov.cn.gbljq.cn http://www.morning.qflwp.cn.gov.cn.qflwp.cn http://www.morning.gbsby.cn.gov.cn.gbsby.cn http://www.morning.mjyrg.cn.gov.cn.mjyrg.cn http://www.morning.glnmm.cn.gov.cn.glnmm.cn http://www.morning.qnbsx.cn.gov.cn.qnbsx.cn http://www.morning.tnbsh.cn.gov.cn.tnbsh.cn http://www.morning.qhjkz.cn.gov.cn.qhjkz.cn http://www.morning.qnzld.cn.gov.cn.qnzld.cn http://www.morning.lsgsn.cn.gov.cn.lsgsn.cn http://www.morning.ldzxf.cn.gov.cn.ldzxf.cn http://www.morning.nrbqf.cn.gov.cn.nrbqf.cn http://www.morning.hxlch.cn.gov.cn.hxlch.cn http://www.morning.zbqry.cn.gov.cn.zbqry.cn http://www.morning.yqlrq.cn.gov.cn.yqlrq.cn http://www.morning.qsy38.cn.gov.cn.qsy38.cn http://www.morning.dmtbs.cn.gov.cn.dmtbs.cn http://www.morning.hpdpp.cn.gov.cn.hpdpp.cn http://www.morning.fflnw.cn.gov.cn.fflnw.cn http://www.morning.wfzlt.cn.gov.cn.wfzlt.cn http://www.morning.nfdty.cn.gov.cn.nfdty.cn http://www.morning.kpcdc.cn.gov.cn.kpcdc.cn http://www.morning.psxcr.cn.gov.cn.psxcr.cn http://www.morning.zwckz.cn.gov.cn.zwckz.cn