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

网站制作价格多少钱佛山南海建设局网站

网站制作价格多少钱,佛山南海建设局网站,淘宝联盟交钱建设网站,网址交易网站一、静态库的封装 我们在学习C语言阶段其实就已经知道一个可执行程序的形成过程分为预处理、编译、汇编、链接这四个阶段#xff0c;而且也知道我们程序中使用的各种库其实是在链接的阶段加载的。 可我们那时候并不知道库是怎么被加载的#xff0c;或者库是怎么形成的…一、静态库的封装 我们在学习C语言阶段其实就已经知道一个可执行程序的形成过程分为预处理、编译、汇编、链接这四个阶段而且也知道我们程序中使用的各种库其实是在链接的阶段加载的。 可我们那时候并不知道库是怎么被加载的或者库是怎么形成的所以今天我们就要好好的来聊一下库的形成。 1.1、库封装的本质 我们知道链接阶段其实是将形成可执行程序的各种.o目标文件连接起来形成可执行程序但是对于一个库来说可是如果一个可执行程序使用的很多函数分散在不同的.o文件中那么这样一个一个的链接就显得很麻烦。 就例如我们现在有这样的一个场景 如上图我们有这样一堆头文件和对应的方法实现我们想要模拟编译器的行为先形成.o文件再将它们连接形成可执行程序。我们当然可以一个一个的将它们编译形成.o文件然后再连接 但这样实在太麻烦特别是后面链接形成可执行的操作如果今天我们的可执行程序依赖了100或200个.o文件那这样不累死人 所以为了方便我们可以将一些有关联的.o文件再次打包形成一个库文件那这样我们在连接的时候就只需要找到这个库文件就行了。 所以库的封装其实就是将一批.o文件打包。 1.2、静态库的封装方法 我们打包静态库使用的指令是ar -rc指令例如我们想要将上面的这些方法打包成一个名为mymath的静态库对应的指令是这样的 注意上面所写的库名称为libmymath.a但是该库的真实名称并不是libmymath而是mymath这是因为库文件必须要一个前缀lib而.a是静态库文件的后缀名。 但是这样使用起来会有点麻烦这是因为gcc在编译形成可执行程序的时候默认值知道系统默认的库的名称和路径我们现在这个是我们自己新建的库所以gcc不认识。所以我们在编译的时候还需要特别指定库名称和库路径。 指定库名称使用的是-l选项执行库路径使用的是-L选项 这样我们才能成功的生成可执行程序 但我们今天还是想要做得更规范一些一般我们的库文件和头文件是被放到一个目录结构中的这样就更像一个整体。 我们编写一个makefile来完成再次打包的工作 这样执行了makefile之后我们就得到了一个更规范的库文件了 然后使用的时候就需要注意了因为我们上面的演示中头文件是和test.c处在同一个路径下的所以编译的时候不需要指定头文件的路径编译器也能直接找到而我们今天已经形成了一个库文件也就是所我们以后其他的源代码想要用这个库中的方法就只需要有这个库文件即可而其他的源代码的路径下就不会有对应的头文件了所以我们在使用的时候还需要多加一个-I的选项表示指定头文件的路径 二、动态库的封装 2.1、动态库的封装方法 动态库的封装就和静态库有点不一样了首先动态库的封装是直接使用gcc的这说明gcc是可以直接形成动态库的。这个后面我也会聊一些这是因为动态库比起静态库来说更重要优先级也更高。 第二个不同的地方也比较特殊了我们在形成对应的.o文件的时候还需要额外的加上一个“与位置无关码”fPIC的选项这个后面我们简单的聊一些其实我也不是很懂记住就行了。 此外还需要加上一个-shared的指令表示生成的是“共享库”这个也是到后面聊 其他的地方就没什么不同了因为库的本质动态库和静态库是一样的。 所以我们就只需要修改一下makefile即可也就是像上面生成静态库一样将二次打包也做好 执行makfile之后我们就形成了动态库了 然后使用动态库生成可执行程序的时候也是个静态库一样 但当我们直接运行的时候就会出现问题了 如果直接运行的话会提示找不到动态库这时候大家可能就会有疑问了我在形成可执行程序的时候不是已经告诉了编译器库的路径了吗怎么还会找不到呢 这是因为静态库和动态库的加载是不一样的。 严格来说静态库是不需要加载的因为静态库是在链接的时候将对应的方法一代码的形式“拷贝”到我们可执行程序的代码部分所以自然的运行的时候就不要再找静态库了。 而动态库不同动态库并不是以代码的形式将拷贝到可执行程序的代码部分它是在运行的时候才加载到“内存”并不是加载到可执行程序中然后由可执行程序在内存中去寻找。 所以我们也就知道了我们编译形成可执行程序的时候只是将库的路径告诉了编译器但运行是操作系统的事操作系统当然不知道我们的库在哪里了。 如果想要解决动态库运行时候找不到库的问题可以有一下四种解决方案。 2.2、解决动态库运行时找不到的三种方法 方法1直接将动态库安装到系统中默认路径下 我们以前在编译可执行程序的时候之所以不需要指定库路径和头文件的路径是因为我们以前使用的都是系统默认支持的库而这些库的头文件都会存在于系统中的两个默认的路径/lib64和/usr/include中。 所以我们今天就可以直接将我们的头文件和库拷贝到这两个路径中 这样我们再次运行就可以正常运行了 并且如果我们今天将可执行程序删掉在重新编译形成也不再需要指定头文件路径和库路径了只需要指定库名称即可 因为我们的头文件和库已经存在于系统的默认路径下了所以在编译的时候就像我们以前使用系统库一样再默认路径下寻找了而之所以还需要指定库名称是因为我们实现的mymath本质上还是属于第三方库而第三方库gcc是不认识的。 而且我们在使用ldd指令来查询可执行程序所依赖的库的时候也是可以查到的并且显示的路径就是/lib64: 而如果我们将刚才加入的头文件和库都删掉在用ldd查询的时候就会显示找不到对应的库了 同时将库直接安装到系统的默认路径下也是我们以后使用第三方库最推荐的一种做法没有之一。 方法2在当前路径下创建连接到库的软连接 其实这也是软连接的一个应用场景当然啦我们也可以将软连接创建到/lib64目录下我当前就不做了。 方法3更改环境变量 在我们的系统中有许许多多的环境变量而其中有一个是和我们今天动态库加载有关的环境变量——LD_LIBRARY_PATH这个环境变量就是用来存储我们需要加载的动态库的绝对路径。 但是有的朋友可能这个环境变量是空的或者不存在这也是很正常的因为有可能你的系统比较新或者你从来没有设置过这个环境变量。 设置了之后我们就可以正常的运行我们的可执行程序了 那我们最后再来做一个实验就是如果同一套方法我们机提供了静态库也提供了动态库编译器会选择哪种库呢 我们可以先将两个库拷贝到同一个目录下 然后我们在重新生成可执行程序再来查看一下它所依赖的库 从结果中我们可以看到默认依赖的是动态库虽然这里找不到但是也能显示出来我们所依赖的是哪一个库(找不到是因为我们现在库的路径变了而且我们也把原来的动态库给删除了)。
http://www.zqtcl.cn/news/764936/

相关文章:

  • 咨询行业网站开发wordpress5.0新版如何发布文章
  • 做网站要什么技术saas建站和开源建站的区别
  • 大型网站建设哪家服务好qq对话制作器app
  • 做免费小说网站怎样赚钱网络推广方案最新
  • 电商网站的建设与运营揭阳专业的网站建设价格
  • 网站策划书包括哪些内容百度官方营销推广平台有哪些
  • 成都企业网站seo重庆企业网站推广费用
  • 广东电白建设集团有限公司网站wordpress 静态地址
  • 微网站和手机站区别工业设计专业学什么
  • 兰州网站建设哪里好素材图片高清
  • 公司网站建设进度设计官网登录入口
  • 中牟高端网站建设wordpress可视化文章
  • 那家公司做网站广西网络营销外包公司
  • 成品网站速成网站知名网站建设加盟合作
  • 零基础学pytho 网站开发Drupal对比WordPress
  • 网站开发 例子快影
  • 宁津建设局网站推介网站
  • c 是用来做网站的吗中国营销策划网
  • 在建设部网站首页莒县网页设计
  • 河北省城乡和住房建设厅网站网店代运营托管
  • 彩票网站建设wordpress判断用户权限
  • 简洁大气企业网站源码h5商城网站建设是什么
  • 河间做网站价格wordpress评论导出
  • 网站关键词布局图网站推广与宣传怎么做
  • 小说类网站程序西安移动网站建设
  • 贵州高端网站建设网站做好了怎么做后台
  • 网站建设与管理 答案国外做免费的视频网站有哪些
  • 网站建设电脑端手机端企业网站建设需求调研表
  • 怎么做游戏网站google国际版
  • 学校网站建设发展规划线上推广的渠道有哪些