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

受欢迎的昆明网站建设php网站开发优化

受欢迎的昆明网站建设,php网站开发优化,如何对网站管理,客户说做网站价格高目录 一、前言 二、对于库的理解 三、静态库 四、动态库 五、动静态库的加载 一、前言 在之前#xff0c;我们讲了静态库和动态库#xff0c;详情请跳转#xff1a;静态库和动态库 下面我们将从工程师的角度#xff0c;去了解静态库和动态库的形成过程#xff0c;以…目录 一、前言 二、对于库的理解 三、静态库 四、动态库 五、动静态库的加载 一、前言 在之前我们讲了静态库和动态库详情请跳转静态库和动态库 下面我们将从工程师的角度去了解静态库和动态库的形成过程以及实现它们的制作。并且了解如何将自己的库交给别人让别人也可以使用。 二、对于库的理解 Linux的库一般分为动态库和静态库 静态库库文件以 .a 为后缀程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库。 动态库库文件以 .so 为后缀程序在运行的时候才去链接动态库的代码多个程序共享使用库的代码。 gcc 在编译时默认使用动态链接链接动态库而如果想生成静态链接我们需要在末尾带上 -static。 而我们知道程序编译链接的最后其实就是将各种 .o 可重定位目标二进制文件包括 main 函数的 .o文件与所包含的 .h 文件全部链接起来形成可执行程序。所以这是不是就意味着用户真正需要的库文件其实是 .o 文件设计者可以不用将源文件提供给用户而直接将.o和.h文件提供给用户以供用户链接。这样不仅方便而且能够保护源码。这样可以吗 如下图在该目录下我们只有.h和.o文件没有这些文件的源码。那么能编译成功吗 编译结果如下 我们发现编译出的可执行程序能够运行。  但是如果存在很多.c文件呢难道我们要把几千个.c文件全部编译成.o在加上头文件全部一个一个提供吗那样太过于麻烦为了让用户更好的使用库我们就有把所有的.o文件打成一个包给对方提供一个库文件。 所以库中包含了多个.o文件。 三、静态库 我们可以使用 ar 命令把所有的.o打包起来来制作一个静态库。比如我们要打包二中所讲到的.o文件 ar -rc libexe.a myadd.o myprintf.o 当然我们也可以写一个Makefile来快速制作一个库。 output而我们要交付库实际上要把库文件 .a 以及匹配的头文件都交付给用户而output就相当于一个发布的过程。 好了那么静态库我已经制作好了且已经发布了那么我们来使用一下自己制作的库。首先我们将库拷贝到 mylib 目录下去使用。 但是当我们编译时却出错了 gcc在编译时找不到头文件  解决方法编译器搜索头文件时默认在当前目录下搜索在系统默认指定路径下搜索。虽然此时的mylib在当前路径下但是头文件太深了编译器找不到头文件所以我们需要给gcc指定路径。如下使用选项 -I 告诉编译器头文件所在路径。 问题又来了gcc找不到库函数的实现。我们在形成可执行程序的时候库文件要使用的话也要知道库所在的路径在哪里系统的默认路径是/lib64而这是我们自己制作的库不在里面。所以我们要带上 -L。告诉库的路径在哪里。因为该路径下可能有多个库所以我们还要使用 -l 选项加上库名字去掉前缀和后缀 .a。 如上图我们编译并且运行成功了。 总结 -I指明头文件的搜索路径 -L指明库文件的搜索路径 -l指明要链接哪个库带上库的名称去掉前缀和后缀 四、动态库 首先我们需要把库文件全部编译成.o文件这里与静态库不同需要带上选项 -fPIC形成与位置无关码。我们还是以上面的文件为例 gcc -fPIC -c myadd.c -o myadd.o gcc -fPIC -c myprintf.c -o myprintf.o 动态库打包需要加上选项-shared。 gcc -shared myprintf.o myadd.o -o lib.so 我们可以建立一个makefile同时形成静态库和动态库。 然后我们发布 接下来我们就来使用一下我们自己制作的动态库。 下图中我们编译成功且形成了可执行程序。  但是当我们运行可执行程序时却失败了 因为我们的lib目录下既有动态库也有静态库所以gcc在编译时默认使用的是动态库。可是既然我已经指明了库所在的路径那为什么在运行可执行程序时还会动态链接失败呢 原因就是那只是在编译时告诉了gcc编译器动态库在哪里然后编译成功且形成了可执行程序如果你在编译时没有告诉库在哪编译就不会成功且不会形成可执行程序。而我们运行可执行程序是由操作系统加载到内存来运行的运行时也需要告诉操作系统库在哪里。我们还没有告诉操作系统动态库在哪里呢 解决方法 1、添加到环境变量里把库路径添加到环境变量LD_LIBRARY_PATH 比如我的动态库所在路径为/home/zdl/mylib/output/lib 但是我们自己定义的环境变量只是本次登录有效如果想永久有效只能修改环境变量的配置但是比较麻烦。想永久有效我们还有其他的方法。  2、配置文件/etc/ld.so.conf.d/动态库进行对应搜索时可以采用自己定义conf文件找到动态库 直接在该路径 /etc/ld.so.conf.d/ 下创建一个以.conf为后缀的文件。 然后将动态库所在的路径添加到文件中即可。 最后使用sudo ldconfig使文件生效。  3、建立软链接直接找到对应的库 可以将库的路径建立软链接到 /lib64/ 路径下。 五、动静态库的加载 静态库静态库是直接将自己的代码和数据拷贝到可执行程序中然后随可执行程序一同加载到内存中。它们相当于已经是一体的了。静态库的代码随可执行程序的代码一起加载到程序地址空间的代码区。 动态库动态库可以和可执行程序分批加载。 动态库加上fPIC选项形成位置无关码采用相对编址的方法在程序链接时对应库当中的偏移量添加到可执行程序运行时一旦库加载进来经过地址空间映射把库映射到地址空间之后库也就具备了起始地址通过偏移地址和起始地址这样就可以找到访问的函数。 具体过程可执行程序在运行时如果遇到某处代码需要调用库的方法库的代码和数据就会加载到物理内存中然后将你需要使用的方法通过页表映射到共享区。然后代码直接到共享区去找再通过页表找到物理内存中的具体方法使用完后代码继续向后执行如又遇到库里的方法就再去找。 如果有多个进程需要使用同一个库那么其他的进程可以直接通过页表和物理内存中的代码直接建立联系。所以动态库加载一次就可以被多个进程共同使用了。 而静态库可能有多个程序用了C库加载到内存时内存里可能会存在很多份重复的代码。而动态链接不会出现重复的代码减少内存占用。
http://www.hkea.cn/news/14340683/

相关文章:

  • 网站建设全过程四川住房和城乡建设厅网站电话
  • 鹤壁网站建设费用wordpress 标签 图片不显示
  • 网站建设合同图表版网站建设流行技术
  • 国外做的比较的ppt网站有哪些wordpress 只在首页显示
  • 局域网内网站建设毕业设计网站建设英文文献
  • 风险网站怎么解决方案可画canvas官网
  • 做网站只有搜网址吗h5网站制作介绍
  • 网站seo如何做好优化google海外版入口
  • 建设网站时 首先要解决两个问题 一是什么手机号电子邮箱免费注册
  • 工信部 加强网站备案百度指数属于行业趋势及人群
  • 电子专业毕设做网站公众号编辑器下载
  • 微信开发 微网站开发的详细流程做交通事故的网站
  • 网站支付开发上海app开发外包
  • wordpress 伪静态 文章打不开网站权重值在较长时间内是一定的页面优化
  • 网站设计背景图片怎么做的网站内怎么做链接
  • 晋江网站建设报价我想做个网站怎么做 找谁做好
  • 重庆住房城乡建设厅官方网站为企业规划网站注意什么
  • 网站开发运作烟台汽车网站建设
  • 站长统计免费下载手表官网
  • 私人做网站建设建设网站及后期维护费用是多少
  • 网站备案人授权学会网站建设能成为一项职业吗
  • 大连网站建设介绍外贸网站建设公司方案
  • 关于小说网站的一些建设流程微信小程序项目源码
  • 免费网站为何收录比较慢网站 成品下载
  • 网站网址查询 优帮云ui设计收费标准
  • 网站开发专业实习报告网站设计与制作简单吗
  • 创意网站建设排行榜wordpress环境部署
  • 用html建设网站郑州企业网站制作怎么做
  • 有哪些做PPT背景网站网站标题的选择
  • 公司网站建设的范文wordpress eshop 教程