1.库的分类

根据链接时期的不同,库又有静态库和动态库之分。

静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行。

有别于静态库,动态库的链接是在程序执行的时候被链接的。所以,即使程序编译完,库仍须保留在系统上,以供程序运行时调用。(TODO:链接动态库时链接阶段到底做了什么)

2 静态库和动态库的比较

链接静态库其实从某种意义上来说也是一种粘贴复制,只不过它操作的对象是目标代码而不是源码而已。因为静态库被链接后库就直接嵌入可执行文件中了,这样就带来了两个问题。

首先就是系统空间被浪费了。这是显而易见的,想象一下,如果多个程序链接了同一个库,则每一个生成的可执行文件就都会有一个库的副本,必然会浪费系统空间。

再者,人非圣贤,即使是精心调试的库,也难免会有错。一旦发现了库中有bug,挽救起来就比较麻烦了。必须一一把链接该库的程序找出来,然后重新编译。

而动态库的出现正弥补了静态库的以上弊端。因为动态库是在程序运行时被链接的,所以磁盘上只须保留一份副本,因此节约了磁盘空间。如果发现了bug或要升级也很简单,只要用新的库把原来的替换掉就行了。

那么,是不是静态库就一无是处了呢?

答曰:非也非也。不是有句话么:存在即是合理。静态库既然没有湮没在滔滔的历史长河中,就必然有它的用武之地。想象一下这样的情况:如果你用libpcap库编了一个程序,要给被人运行,而他的系统上没有装pcap库,该怎么解决呢?最简单的办法就是编译该程序时把所有要链接的库都链接它们的静态库,这样,就可以在别人的系统上直接运行该程序了。

所谓有得必有失,正因为动态库在程序运行时被链接,故程序的运行速度和链接静态库的版本相比必然会打折扣。然而瑕不掩瑜,动态库的不足相对于它带来的好处在现今硬件下简直是微不足道的,所以链接程序在链接时一般是优先链接动态库的,除非用-static参数指定链接静态库。

gcc作为编译工具,用在Linux操作系统中,可以编译C、C++、Object-C、JAVA等语言。编译过程中可以带编译选项,选择编译过程。

一、GCC编译流程

1)预处理 Pre-Processing
2)编译 Compiling
3)汇编 Assembling
4)链接 Linking

二、GCC编译选项

1、gcc总体选项列表

1) -c :指编译,不链接,生成目标文件“.o”。
2) -S :只编译,不汇编,生成汇编代码“.S”。
3) -E :只进行预编译/预处理,不做其他处理。
4) -o file:把输出文件输出到file里。
5) -g :在可执行程序中包含标准调试信息。
6) -v :打印出编译器内部编译各过程的命令行信息和编译器的版本。
7) -I dir :在头文件的搜索路径列表中添加dir目录
8) -L dir :在库文件的搜索路径列表中添加dir目录
9) -static :连接静态库(静态库也可以用动态库链接方式链接)
10) -llibrary :连接名为library的库文件(显示指定需要链接的动态库文件)

2、gcc告警和出错选项
1) -ansi :支持符合ANSI标准的C程序
2) -pedantic :允许发出ANSI C标准所列出的全部警告信息
3) -pedantic-error :允许发出ANSI C标准所列出的全部错误信息
4) -w :关闭所有警告
5) -Wall :允许发出gcc提供的所有有用的报警信息
6) -werror :把所有的告警信息转化为错误信息,并在告警发生时终止编译过程

3、gcc优化选项
gcc可以对代码进行优化,它通过编译选项“-On”来控制优化代码的生成,其中n是一个代表优化级别的整数。对于不同版本的gcc,
n的取值范围不一致,比较典型的范围为0变化到2或者3。
虽然优化选项可以加速代码的运行速度,但对于调试而言将是一个很大的挑战。因为代码在经过优化之后,原先在源程序中声明和使用
的变量很可能不再使用,控制流也可能会突然跳转到意外的地方,循环语句也可能因为循环展开而变得到处都有。

程序编译的过程。如下图:

参考文章:
gcc编译工具生成动态库和静态库之一----介绍
C/C++ 静态链接库(.a) 与 动态链接库(.so)

iOS编译过程的原理和应用
https://blog.csdn.net/Deft_MKJing/article/details/82929014

《大前端开发者需要了解的基础编译原理和语言知识》读后感

编译-编译原理C/C++ 静态链接库(.a) 与 动态链接库(.so)相关推荐

  1. lib库反编译C语言,C语言静态链接库(lib)与动态链接库(dll)

    今天看到了之前的笔记,看到之前写的笔记,感觉自己都不认得了~~一.静态链接库(lib) 首先创建    "在VC6中创建项目:Win32 Static Library" 在项目中创 ...

  2. 静态链接库(Lib) 与 动态链接库(DLL)

    静态链接库(Lib) 与 动态链接库(DLL) 一.VS中添加LIb库及头文件(外部依赖项)的步骤: 1.添加工程的头文件目录:工程-属性-配置属性-c/c+±–常规-附加包含目录:加上头文件存放目录 ...

  3. 静态链接库(.lib)和动态链接库(.dll)的使用

    静态链接库(.lib)和动态链接库(.dll)的使用 文章目录 静态链接库(.lib)和动态链接库(.dll)的使用 一.静态链接库 1. 静态链接库概述 2. 创建静态链接库 3. 调用静态链接库 ...

  4. 静态链接库(Lib)和动态链接库(DLL)

    序言:本文主要讲解静态链接库和动态链接库的区别,以及怎么样编译和引用两种库,怎么样从DLL中导出函数和导出C++类. 一.静态链接库和动态链接库 1.静态链接库(.LIB):函数和数据被编译进一个二进 ...

  5. 浅谈静态链接库(SLL)和动态链接库(DLL)

    静态链接库和动态链接库 静态连接库就是把(lib)文件中用到的函数代码直接链接进目标程序,程序运行的时候不再需要其它的库文件:动态链接就是把调用的函数所在文件模块(DLL)和调用函数在文件中的位置等信 ...

  6. 静态链接库LIB和动态链接库DLL的区别 创建和示例

    1.什么是静态连接库,什么是动态链接库   静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意, lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了. 但是若使 ...

  7. MFC模块的动态链接库DLL以及静态链接库LIB编译后的调用

    静态链接库LIB和动态链接库DLL的区别,创建和示例   1.什么是静态连接库,什么是动态链接库   静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都 ...

  8. linux 静态编译多媒体框架,Go编译32位GNU静态链接库的方法

    Go链接库系统的难用可谓是人尽皆知,不同Go版本编译出来的不兼容,而且只支持GNU的,不能编译出Windows上的dll和lib. 本次有需求是将Go代码编译成32位GNU静态链接库. Go代码 编写 ...

  9. 动态链接库和静态链接库的相互包含问题及实现

    动态链接库和静态链接库的基本概念请参考 1.<深入理解计算机系统>第七章链接 2.<程序员的自我修养>第4章 静态链接和第7章 动态链接 3. http://blog.jobb ...

最新文章

  1. Java知多少(完结篇)
  2. 【NLP实战系列】朴素贝叶斯文本分类实战
  3. 说下网鼎杯第四场的双色块
  4. Python中的模块和包:模块的(动态)导入、__future__模块使用
  5. swagger 修改dto注解_Web服务开发:Spring集成Swagger,3步自动生成API文档
  6. 某大型银行深化系统技术方案之十一:核心层之业务活动监控
  7. 请求头User-Agent作用?
  8. 【技巧】如何给CSDN上的每篇原创文章添加版权声明
  9. 图灵——如迷的解谜者
  10. EasyUI 中文乱码问题
  11. 尾行3解3D马赛克补丁
  12. 从贫穷到富有——我的修行之路
  13. 基因组+转录组助力油菜种子油含量自然变异的遗传研究
  14. 110配线架打法图解_110配线架的打线方法图例
  15. 一、前端入门学习笔记-标签(1)
  16. Java基础(五):Java数组声明与初始化
  17. 怎样在线将图片制作成圆角图样式
  18. 已知坐标用matlab画图,已知45个点X Y Z的坐标值已知,如何用matlab画出网格图,每......
  19. linux dae文件下载,linux dae命令详解.doc
  20. Django 中间件之限制ip访问次数 和 黑名单

热门文章

  1. HashTab---Windows资源管理器的文件属性窗口中添加了一个叫做”文件校验”的标签...
  2. Winform控件:打开文件对话框(OpenFileDialog)
  3. CentOS 6.7 配置 yum 安装 nginx
  4. 百度地图-解决新版百度定位失败问题
  5. Spark 1.0 开发环境构建:maven/sbt/idea
  6. 2008.04.14狼图腾
  7. 雅虎公司C#笔试题,看看你能解答多少? [含答案]
  8. Cassandra使用的各种策略
  9. windows禁用/启用hyper-V,解决hyper-V与模拟器同时启用时造成冲突
  10. 外部排序归并排序 败者树