linux学习-1简析静态库与动态库的区别与联系

举报
星辰27 发表于 2020/08/27 10:42:58 2020/08/27
【摘要】 本文主要简析一下静态库与动态库的区别与联系,记录一下自己的学习过程,如有错误,欢迎指出交流,多谢,后续会逐渐完善。

1简介

我们知道从源代码到可执行程序的转换需要经历编译、汇编以及链接,或者可以简单的理解成2步,编译和链接。通过编译,可以将每个源文件生成一个目标文件(即.c/.cpp -> .o文件)

2静态库与动态库

首先什么是库文件呢?库文件是就是一种可执行代码的二进制格式,可以被载入到内存中执行,具体可以分为静态库文件以及动态库文件,二者同时存在同名文件,优先调用动态库文件。

2.1静态库

1)命名方式:静态库即.a文件,一般命名为lib+库名.a

2)特点:由于静态库文件包含所有数据以及函数因此静态库文件比较大。正因如此,其可以脱离源文件执行,即删除相关C文件之后仍可执行,实际上作用于目标文件(.o.

3)载入时刻:编译的时候直接别嵌入到可执行文件中。

(4)生成指令:可略有不同

ar -rc libxxx.a xxx.o

2.2动态库:

1)命名方式:动态库即.so文件,一般命名为lib+库名.so

2)特点:动态库相比静态库要小很多,但其依赖源文件,一旦删除源文件将无法执行

3)载入时刻:可执行程序运行时才被载入内存。

(4)生成指令

gcc -fPIC -shared xxx.c -o libxxx.so,其中-fPIC 指的是位置无关即载入时重定位

5)注意:调用时注意其路径,一般在linux默认生成在usr/lib下

3 gcc常用选项列表

1 -c :只编译,不链接,生成目标文件“.o”

2 -S :只编译,不汇编,生成汇编代码”.s”

3 -E :只进行预编译。

4 -o file:把输出文件输出到file里。

5 -o0 不进行优化处理、-o-o1优化生成代码

6 -shared 生成共享目标文件,通常构建动态库

7 -g :在可执行程序中包含标准调试信息。

8 -v :打印出编译器内部编译各过程的命令行信息和编译器的版本。

9 -I dir :在头文件的搜索路径列表中添加dir目录

10-L dir :在库文件的搜索路径列表中添加dir目录

11-static :连接静态库(静态库也可以用动态库链接方式链接)

12-llibrary :连接名为library的库文件

选项以及警告等更加详细的内容参考https://blog.csdn.net/gatieme/article/details/21389603


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。