头文件与库文件、静态链接与动态链接、静态库与动态库(共享库)

1、头文件在哪里?
头文件:作为一种包含功能函数、数据接口声明的载体文件,主要用于保存函数的声明。C++标准库头文件,不同的编译器默认路径不相同。

Vc6.0:一般在安装目录下的\VC98\INCLUDE目录,
比如C:\Program Files (x86)\Microsoft Visual Studio\VC98\INCLUDE。
Vs:一般在位于$VSPATH\VC\include路径下面。
Gcc:一般默认在 /usr/include目录下。

2、库文件在哪里?
库文件:存放函数的定义(实现),一般以二进制形式提供给用户使用;
在 /usr/lib文件中。

库文件通过头文件向外导出接口,用户通过头文件找到库文件中需要的函数实现代码进行链接至程序当中。

3、可执行程序/命令在哪里?
Linux下,可以通过which指令查看相关可执行文件的信息。
/bin 存放二进制可执行命令
/usr 目录下,几乎包括所有要用到的应用程序指令和文件

4、什么是库?
库是一种可执行代码的二进制形式,是别人已经写好、适用成熟、在遵守相关协议下可以复用被操作系统载入内存中执行的代码。
Linux中的库包括动态库和静态库。
5、共享库/静态库区别?
1)共享库(动态库):/lib
动态链接下,一个程序被分成若干个文件(模块),包括可执行文件和程序所依赖的共享对象,所以动态链接过程需要考虑装载问题。
其装载通过一系列由动态链接器提供的API(即四个函数:dlopen()打开动态库、dlsym()查找符号、dlerror()错误处理、dlclose()关闭动态库)进行操作。
(1)Linux下的共享库:普通的ELF共享对象(ELF文件头包含整个文件的基本属性,主要用于API操作处理)
(2)Windows下的共享库:DLL,动态链接即可实现运行加载

2)静态库:
静态链接下,整个程序最终只会生成一个不可分割的可执行文件,即整个进程中只有一个文件要被映射。(空间与地址分配、符号解析与重定位)

3)产生动态链接方式的原因:
静态链接,简而言之就是将程序运行所需的指令和数据全部装入内存中使得内存可以顺利运行,然而这种方式虽然简单但又粗暴,极大程度的浪费内存空间。针对程序运行时的局部性原理,我们可以将不常用的数据存放在磁盘中,只将不同的程序所需的不同模块装入内存,这样便有效的利用内存空间,即产生动态链接(覆盖装入、页映射)。
动态链接的产生,则需要对应的动态库,由于动态库中的各模块可供用户选择使用从而也实现了模块资源共享,因此动态库又称共享库。
4)二者区别:
二者一般为编译集成的一系列接口,在程序源代码编译完成后通过编译器、链接器与这些库进行链接,最终实现程序的运行。
区别主要在于库中代码被载入的时刻不同
(1)静态库:在程序编译时期会被连接到目标代码中,由于静态链接只会生成一个可执行代码,因此目标程序运行时不需要再载入。
(2)共享库:在程序编译时期仅简单引用,不会被连接到目标代码中,而是在程序运行时才被载入,因此在程序运行时需要动态库存在。“以时间换取空间”

你可能感兴趣的:(读书笔记,Linux)