linux学习-1简析静态库与动态库的区别与联系
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
- 点赞
- 收藏
- 关注作者
评论(0)