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

dw做的静态网站怎么分享链接宁波seo推广费用

dw做的静态网站怎么分享链接,宁波seo推广费用,微信营销网站模板,百度收录排名目录 ​编辑 前言 静态库 为什么要使用库(形成原理 ) 生成一个静态库 静态库的使用 动态库 生成一个动态库 动态库的使用 解决方法 动态库加载过程 ​编辑 前言 库(Library)是一种方式,可以将代码打包成可重用的格式(站…

 

目录

​编辑

前言

 静态库

为什么要使用库(形成原理 )

 生成一个静态库

静态库的使用

动态库

生成一个动态库

动态库的使用

解决方法

动态库加载过程

​编辑


前言

库(Library)是一种方式,可以将代码打包成可重用的格式(站在巨人的肩膀上),供其他程序调用。

库可以分为静态库(StaticLibraries)和动态库(Dynamic Libraries 或 Shared Libraries)

  • 动态库:库文件,以.so为后缀(Windows中为.dll)
  • 静态库:库文件,以.a为后缀(Windows中为.lib)

库的命名规则:lib库名.后缀
所以掐头去尾才是它的库名。使用gcc进行编译的时候,默认是采用的动态链接,如果要使用静态链接需要加上选项-static

libc.a            libstdc++.so.6

所以这两个库名分别为cstdc++

库中的内容都是一些被编译过但是还未被链接的目标文件(以.o或者.obj结尾的二进制文件)。

 静态库

静态库在程序编译链接的时候将库的代码整合复制到可执行文件中的代码和数据中,生成的可执行程序在运行时将不再需要静态库,因此使用静态库生成的程序大小比较大;

为什么要使用库(形成原理 )

  • 当我们需要程序功能提供给别人时,但又不想直接给出源码,我们可以将源文件汇编成二进制文件(二进制文件不会暴露源码)后,将头文件和二进制文件目标文件交给别人;
  • 不仅如此,日常中将常用功能打包成库也可以提高效率

 生成一个静态库

ar -rc 生成库的名字 源文件...

ar 命令是 gnu 的归档工具,常用于将目标文件打包为静态库,ar(archive)

  • -r (replace):若静态库文件当中的目标文件有更新,则用新的目标文件替换旧的目标文件
  • -c (create):建立静态库文件

 一般静态库是以.a为后缀

以一个简单的运算为例

将函数定义的.c文件编译成二进制文件   

 

使用ar命令,将这些二进制文件打包成静态库

静态库的使用

前面我们创建了一个简单的静态库;

当我们的程序依赖某个静态库时,链接器(linker)会将库中的相关文件整合到可执行文件中(前面提过),我们的test.c文件依赖库中的sub,sum函数,如果不链接库,只能一个个链接源文件

而现在我们已经将所需的函数打包成了静态库libmymath.a;
考虑使用以下指令:

gcc -o test.exe test.c -I ./mymath/include/ -L ./mymath/lib/ -lmymath

注:

  • 编译器不知道所包含的头文件.h在哪,所以需要我们指定头文件的搜索路径;
  • 头文件中只有函数的声明,没有函数定义,所以需要我们指定所要链接库文件的搜索路径;
  • 编译器也不知道需要链接的库在哪里,是哪一个库,这还需要我们指定路径;因为库目录下可能有很多库文件;
  • 平时所写的C/C++不需要这些选项可以直接编译,是因为我们写的库不在系统默认路径下;
  • -I:指定头文件搜索路径(大写的i)
  • -L:指定库文件搜索路径
  • -l:指明需要链接库文件路径下的哪一个库(L的小写)

生成的文件很大,因为链接静态库后,该库中的所有数据和代码都存在可执行文件中,所以后续将静态库删除也不会影响程序的执行;​​​​

file查看文件 

 

可以看到描述,我提供的明明是静态库,为什么是动态链接 

  • gcc 默认是动态链接的(建议行为),对于特定的一个库,究竟是动态链接还是静态链接,取决于你提供的是动态库还是静态库
  • 一个可执行性程序不可能只依赖一个库函数,也就是说必须依赖多个库函数
  • 但是,假设动静态库同时给你,编译器只能把静态库拷贝到可执行程序里面,然后只能进行动态链接,哪怕只有一个动态库剩下的全是静态库,链接依旧是动态链接
  • 全部提供的是动态库,链接也是动态链接;提供有指定的静态库,再以静态的方式编译,这样链接就是静态链接

动态库

  • 动态库(Dynamic Libraries)能够使多个程序共享同一份库代码,而不需要将这些代码复制到每个程序的可执行文件中,从而节省系统资源并便于维护和更新。 
  • 与静态库不同的是,动态库被链接后存在于进程的共享区域内,该区域内的数据和代码可以供多个进程使用。也就意味着,如果我们在生成可执行文件之后,将动态库删除,程序便会报链接错误。这是和使用静态库不一样的地方。

生成一个动态库

gcc -fPIC -c sub.c
gcc -fPIC -c sum.c

选项 -fPIC:表示生成位置无关码。

  • 位置无关码的意思就是,生成的代码在内存中可以被加载到任何位置,而不是某个固定的地址。这种特性对于动态库尤其重要,因为动态库需要能够被多个不同的程序共享,并且每个程序可能将库加载到不同的地址空间。位置无关码的寻址方式为相对寻址,可以将代码中的所有指针认为是一个个偏移量,不同的程序给与它不同的初始地址,这样就能灵活的将库加载到其它的地方。

生成动态库时我们不必使用ar命令,使用 gcc 生成动态库即可,多加了一个选项 -shared 

选项 -shared 表示 链接器 生成一个动态库而不是默认的可执行文件。生成的动态库文件以.so结尾。

动态库的使用

  • 动态库是在运行时被访问的, 编译器能指定路径能找到动态库,不代表操作系统能找到;
  • 静态库没有这样的问题是因为它是一次性工程,在链接阶段将所有的代码和数据都拷贝到程序内部了;
  • 对于一个动态库,链接时要告诉编译器自己在哪,运行时要告诉操作系统在哪;

解决方法

  • 安装到系统:
    • 将我们自己的动态库拷贝到/lib里面,就能成功运行了:
  • 建立软链接:
    • 在/lib目录下建立软连接
  • 命令行导入环境变量:
    • 修改动态库默认路径的环境变量LD_LIBRARY_PATH:
    • export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
      • 其中/usr/local/lib表示库路径
  • 修改.bashrc配置文件,让环境变量永久生效 
    • 找到LD_LIBRARY_PATH配置项,并在其路径下添加库的路径,这样每次登录都会自动生效。
      如果你发现你的./bashrc没有LD_LIBRARY_PATH那你可以自己手动加一个环境变量LD_LIBRARY_PATH过去:export LD_LIBRARY_PATH=/path/to/your/libs:$LD_LIBRARY_PATH

动态库加载过程

 

http://www.15wanjia.com/news/44883.html

相关文章:

  • 做网站的网络公司有哪些北京自动网络营销推广
  • wordpress 图片浮动seo优化工具
  • 石家庄裕华区疫情最新消息百度快照优化培训班
  • 武汉企业信息查询重庆seo教程博客
  • 学做淘宝店的网站吗站长之家seo查找
  • 苏州网站搜索优化seo关键词排名查询
  • 上市企业网站建设seo顾问是干什么
  • 意大利新闻无忧seo
  • 深圳住房和建设部网站win7系统优化软件
  • 做动态图网站违法吗上海网站建设seo
  • 网站页面标题设置公关策划公司
  • 中山做网站哪家专业营业推广的形式包括
  • 上海做网站较好的公司男生最喜欢的浏览器推荐
  • 轻量应用服务器可以做网站吗香飘飘奶茶软文
  • wordpress views插件抖音seo查询工具
  • wordpress做的网站吗百度图片搜索引擎
  • 山东外贸建站seo网站建设公司
  • 什么网站时候做伪静态百度首页网址是多少
  • 龙华、宝安最新通告seo与sem的区别和联系
  • 做网站软件图标是一个箭头的模板网站建站公司
  • 精品课程网站开发的创新点品牌营销策略有哪些方法
  • 网站升级建设百度站长平台账号购买
  • 网站建设制作设计营销公司四川北京最新消息今天
  • html5手机网站制作教程项目优化seo
  • 成都有哪些网站建设seo日常优化内容是什么
  • c 做网站怎么居中网站推广策略有哪些
  • 雅安市建设局网站2022黄页全国各行业
  • 嘉兴高端网站建设产品50个关键词
  • 网站后台管理增加功能站长工具seo综合查询收费吗
  • 用ps做网站页面的大小最近一周新闻热点回顾