当前位置: 首页 > news >正文

河北住房和城乡建设网站国内最新的新闻

河北住房和城乡建设网站,国内最新的新闻,wordpress怎么添加友链,常州市新北区建设与管理局网站静态库动态库的生成与使用 :【 多图预警 】 动态库的生成(重点) 静态库的生成(重点) 查看动态库和静态库的汇编代码进行对比(了解) 库的使用(重点) 链接的时候使用库(重…

静态库动态库的生成与使用 :【 多图预警

本节课重要的原因:以后的使用大多数都是使用现成的动态库和静态库,在本文章我们以加法add()函数建一个动态库和静态库,分过程讲解动态库和静态库的生成与动态库使用。,使用动态库讲述链接与运行加载库的过程(静态库的链接与动态库一样,不一样的是静态库运行时不需加载静态库

库文件: 把所用到的所有代码的实现打包成一个文件。库中的代码没有main函数(和可执行程序的区别)

动态库的生成

动态库的命名:一般的动态库命名:lib().so 。 ()里面是动态库起的名字,以lib作为开始,以.so表明它是动态库
生成动态库:使用gcc
第一步: gcc-fPIC -c add.c -o add.o
第二步: gcc --share add.o -o libadd.so
讲解:gcc -c add.c -o add.o 普通的来讲 gcc add.o -o add 生成可执行程序了 没有main函数就会报错,有了main函数就不能生出库
所以:要写成gcc --share add.o -o add.so的形式

动态运行的时候加载,加载到内存之后,需要在多个程序中都要去使用。这样我们需要理解一个程序的运行需要将内存中的代码和数据映射到进程虚拟地址空间中映射到虚拟地址空间去才能访问,这个动态库需要映射到各个库独立的虚拟地址空间中去才能被访问,生成库的时候有自己的信息,映射的时候 ,无法保证每个程序都将它映射到虚拟地址空间中的同一位置,所以动态库就不能用于每个程序,所以要加上fPIC 产生位置无关的代码,库映射到虚拟地址空间的同一位置,每一个函数进行计算的时候拿偏移量+首地址就能得到,便于映射到每一个程序中(了解)。

在这里 我们把加法函数建一个动态库和静态库去使用和讲解
新建一个add.c文件

  1 #include <stdio.h>2 int main ()3 {4 5   printf("%d\n".add(2,3));6   return 0;7 }

在新建一个main.c文件

  1 #include <stdio.h>2 int main ()3 {4 5   printf("%d".add(2,3));6   return 0;7 }

动态库的生成过程:

在这里插入图片描述
可以看到我们的文件中已经存在动态库libadd.so

静态库的生成:

静态库的命名:般的动态库命名:lib().a 。 ()里面是静态库起的名字,以lib作为开始,以.a表明它是静态库
生成静态库:使用gcc/ar
第一步: gcc -c add.c -o add.o
第二步: ar -cr add.a add.o
讲解:直接将代码拿到程序中来,不关心动态库偏移量的问题,所以可以不加-fPIC,加上也行

静态库的生成过程

在这里插入图片描述
可以看到我们的文件当中已经存在静态库libadd.a

查看动态库与静态库汇编代码对比

执行命令:objdump -S
查看动态库的汇编代码:objdump -S libadd.so
在这里插入图片描述
查看静态库的汇编代码objdump -S libadd.a
在这里插入图片描述
对比与总结:动态库的汇编指令比较多,其中加载的比较多, 有符号表,注册信息,代码信息(动态库的汇编指令还没有罗列完,还有很多)

库的使用:

在讲库的使用之前先要弄清楚为什么链接的时候要使用库呢???
运行的时候 不能生成可执行文件,因为没有add函数的声明
在这里插入图片描述
接下来我们看:
在这里插入图片描述
运行错误没有找到add有关的动态库,这是为什么呢???
因为动态库和静态库链接的时候都是到指定位置下找动态库和静态库的位置。所以我们要把库放在指定路径下。当然链接也有其它的方法,我们往下进行浏览

  1. 将库文件放置在指定的路径下
    指定命令 sudo cp libchild.so /lib64/
    重新编译 gcc -o main main.o -lchild 就好了
    在这里插入图片描述
    运行成功(add(2,3) = 5)但是放到指定路径下会污染系统目录,使用完记得在路径下删除文件(以便我们验证后面的方法)
    记得删除系统目录中的:sudo rm -rf /lib64/libchild.so
    在这里插入图片描述
    删除完毕系统指定目录下的libadd.so,再次编译就生成不了可执行文件main了。
  2. 设置LIBRARY_PATH环境变量
    export LIBRARY_PATH=${LIBRARY_PATH}: ./ (加上{} 表示变量)
    echo $LIBRARY_PATH 查看环境变量LIBRARY_PATH内容
    在这里插入图片描述
    此时生成不了可执行程序main。设置环境变量LIBRARY_PATH,并将./赋给环境变量LIBRARY_PATH
    接下来,重新编译 gcc -o main main.o -lchild 就好了
    在这里插入图片描述
    但此时还是无法运行因为接下来还要讲运行时加载动态库(后面运行时使用库会将原因的)
    在这里插入图片描述
    unset LIBARY_PATH 删除环境变量
    在这里插入图片描述
    删除环境变量后,无法在生成可执行程序main函数了

3.通过gcc -L选项设置链接库的默认搜索路径 gcc -o main main.o -L ./ -ladd(常用的方法)
注意
-l : 指定连接库名称
-L:指定库的链接搜索路径(./在当前文件下)
在这里插入图片描述
但是和设置环境变量的使用一样,生成可执行程序后,运行不了程序;但是将库放置在指定文件下就可以运行main得到答案。接下来我们讲运行时使用库。

  • 运行的时候使用库

运行的时候使用库使用的是动态链接生成的动态库。静态链接运行的时候不需要加载库,只有动态库才会在运行的时候加载库
./main 运行不了

  1. 将库文件放置到指定的路径下
    和链接的时候使用库用法一样,将libadd.so 放置指定路径下就可以运行了 。sudo cp libchild.so /lib64/。所以将动态库放置在这个路径下,可以直接成main并执行程序,得到答案
  2. 设置LD_LIBRARY_PATH环境变量(用法同链接时一样)
    在这里插入图片描述
    删除环境变量后,运行不了main程序了
    在这里插入图片描述

在动态库的链接与运行时要注意:

gcc 默认链接的是动态库,-l加上库的名称的话默认是先找动态库,若没有动态库,则就是找静态库。 当一个路径下(或第三方库)既有动态库又有静态库,想链接静态库的时候,拿出来放置到另一路径下,去搜索。

ldd 查看当前程序所依赖的库

ldd main 查看main程序所依赖的动态库
在这里插入图片描述
not found 没有找到所依赖的动态库。只设置了链接时的时候使用了库,运行的时候没有使用库
所以ldd main中 libadd.so还是没有找到

在这里插入图片描述
运行的时候链接库 ,此时就可以找到依赖的动态库了。可以运行了 运行结果如下:
在这里插入图片描述
动态库和静态库的知识也并不是特别难,多动手操作操作,我们就会更加熟练的掌握,我也会一直更新,帮助更多的人,顺便我也是总结学习,一起进步。^ _ ^

http://www.lbrq.cn/news/2669257.html

相关文章:

  • 网站首页动画效果太原seo快速排名怎么样
  • wordpress4.8.2优化分析
  • wordpress电话修改seo怎么发布外链
  • dede title 我的网站投放广告的渠道有哪些
  • 茶企业网站优化大师如何删掉多余的学生
  • 廊坊制作网站公司原画培训机构哪里好
  • 中企动力做的网站怎么样宁波seo入门教程
  • 深圳公司做年报网站搜索引擎优化方法总结
  • 代理加盟网站建设公司seo网站关键词排名提升
  • wordpress好玩的主题北京网站优化对策
  • pc网站建设哪个好合肥网站建设程序
  • 大庆市城乡建设局网站青海seo技术培训
  • 网站建设的好处打开免费百度啊
  • 物流网站风格外链发布论坛
  • 做cpa广告网站教程网站开发培训
  • 自助建站程序宁波seo整站优化软件
  • 做网商要创建网站吗中国免费网站服务器2020
  • react是网站开发搜索引擎营销的英文缩写
  • wordpress整站数据转移网站怎么打开
  • 网站建设广州天津seo排名扣费
  • 四川省的住房和城乡建设厅网站首页淄博网站推广
  • 河南那家做网站实力强长沙seo网络推广
  • 哈尔滨搭建网站软件公司
  • 百度联盟 网站备案2345浏览器下载
  • 江西建设厅网站证书查询如何在其他平台做推广
  • 做网站需要知道什么软件运营怎么做
  • dwcs3做网站广州网络推广公司有哪些
  • 廊坊做网站哪家好个人网站免费域名注册
  • 做化工贸易要用那些网站推广关键词优化排名软件怎么样
  • 亚洲男女做暖网站网络营销相关工作岗位
  • Pico+unity VR入门开发超详细笔记2025
  • JAVA+AI简化开发操作
  • Java集合中的 LinkedList
  • 【数据分享】各省农业土地流转率(2010-2023)
  • Java基础-完成局域网内沟通软件的开发
  • 云服务器--阿里云OSS(2)【Springboot使用阿里云OSS】