type
status
date
slug
summary
tags
icon
password
一、 C++在编译时的基本知识
在一个 C++ 工程中,并不是所有代码都会编译成可执行文件。只有带有 main 函数的文件才会生成可执行程序。而另一些代码,我们只想把它们打包成一个东西,供其他程序调用。这个东西叫做库。 一个库往往是许多算法、程序的集合。
一般来说,build一个项目的过程是先compile然后link,最后生成一个可执行文件的过程。
二、 库
库的本质是一堆函数实现的集合,函数被编译在一个文件里面。然后根据使用方式的不同分为静态库和动态库两类。在动态库里,又分为动态链接库(Dynamic linked library)和动态加载库(Dynamic load library)。
1、 静态库
静态库是在build的时候就将库里面的代码链接进可执行文件。
在静态库的方案下,库的版本更新以后,需要重新编译程序,才能将更新以后的代码起作用。
使用静态库的场景并不是很多,大多数时候是作为第三方提供SDK给别人,但是又不希望别人看到源代码的场景下。所以又静态库生成的可执行程序的特点就是体量大,速度快。
2、 动态库
动态库是分为动态链接库(Dynamic Link Library)和动态加载库(Dynamic Loaded Library)两个。
① 动态链接库
对于动态链接库而言,build可执行文件的时候需要指定它依赖哪些库,当可执行文件运行时,如果操作系统没有加载过这些库,那就会把这些库随着可执行文件的加载而加载进内存中,供可执行程序运行。如果多个可执行文件依赖同一个动态链接库,那么内存中只会有一份动态链接库的代码,然后把它共享给所有相关可执行文件的进程使用,所以它也叫共享库(shared library)。比如pthread就是一个这样的库。
② 动态加载库
对于动态加载库而言,build可执行文件的时候就不需要指定它依赖哪些库,当可执行文件运行时,如果需要加载某个库,就用dlopen、dlsym、dlclose等函数来动态地把库加载到内存,并调用库里面的函数。各大软件的插件模块基本上就都是这样的库。
- 作者:JucanaYu
- 链接:https://jucanayu.top/article/1337ab71-7095-80d4-83e2-f11b0b51decb
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。