2. 使用CMake添加一个库
1. 什么是 library(库)?
库 = 函数库,所谓库,就是将函数封装成库来供我们使用,包含静态库和动态库。
对于代码到可执行程序的过程,这里简单复习一下:
源文件 → 预编译 → 编译 → 汇编 → 链接 → 可执行文件
预编译是使用预编译器cpp进行处理.c源文件和.h头文件,最终生成一个.i的文件。预编译过程就是处理源代码中以#开头的预编译指令,如#include #define 等。
编译的过程就是将 预处理 完的文件进行一系列的词法分析、语法分析、语义分析及优化,最后生成 .s 汇编代码文件。
汇编是将汇编代码转变成机器可以执行的指令, 每一条汇编代码几乎都对应着一条机器指令。最后生成一个 .o 目标文件。
链接是将我们编译出来的目标文件和我们代码所用到的库文件一起打包成一个可执行文件的过程,而这个库文件,就是本节中要提到的库。例如我们的目标文件中用到了一个函数 print , 这个函数的定义在某个库当中,我们就需要对这个库进行链接。
2. 静态库(static library)和动态库(dynamic library)
- 静态库:一些庞杂的用于完成特定功能的函数代码仓库的文件随着程序代码文件一起被编译成二进制文件成为程序的一部分。这部分函数代码文件就叫做静态函数库。
好处:程序可以独立运行,运行时不在依赖外部某些特定的功能。
缺点:会造成程序的体积会变大。 - 动态库:存放在系统中的某个特定位置,提供了一些大部分程序都会使用到的功能集合。这样主程序在编译的过程当中就不需要把这部分功能编译到自己的程序中。只需要到系统中特定的位置直接调用动态函数库的功能就行了。
好处:程序自身的体积不会因为动态函数库变大
缺点:就是程序运行过程中使用到了这些函数库内的功能时,万一系统特定的位置没有对应的动态库。就会造成程序崩溃或者各种奇怪的问题。
3. 使用 CMake 创建库
为了使用 CMake 添加和使用函数库,我们将会使用下面几个函数和宏:
add_library()
add_subdirectory()
target_include_directories()
PROJECT_SOURCE_DIR
以官方教程中的实例来分别学习下以上几个函数和宏的用法,首先教程中示例的目录结构如下:
-
在根目录有用于创建可执行文件的目标文件 tutorial.cxx 和一个配置头文件 TutorialConfig.h.in 以及 CMakeLists.txt 文件,然后是一个文件夹 MathFunctions,里面存放了用于编译成库的文件,我们最终想要实现的目的是将该文件夹中的文件编译成库,所以在这个文件夹内部也创建了一个CMakeLists.txt 文件,该 CMakeLists.txt 文件调用函数
add_library()
添加一个库,这里指定库的名字为 MathFunctions,然后用于生成库的文件为 mysqrt.cxx,因此,该函数为如下形式:add_library(MathFunctions mysqrt.cxx)
-
在文件夹中添加了 CMakeLists 文件之后,该文件并不会自动调用生成我们需要的函数库,因此,在根目录中的 CMakeLists.txt 文件中应当把该文件夹内的 CMakeLists 也包含进来:
-
使用
add_subdirectory()
添加含有其他 CMakeLists 的目录,函数的参数为文件夹的路径,注意该路径下一定要有 CMakeLists 文件,在这里为add_subdirectory(MathFunctions)
当执行根目录的 CMakeLists 时,该函数会同步调用指定文件夹中的 CMakeLists。(函数 add_subdurectory() 还有连个可选参数, 具体用法参考:Cmake命令之add_subdirectory介绍 - 简书 (jianshu.com)) -
还记得生成可执行文件的步骤中的链接吗,我们虽然生成了MathFunctions 这样一个函数库,但是并没有和我们的项目进行链接,
target_link_libraries(Tutorial PUBLIC MathFunctions)
对上面生成的函数库进行链接,为了使用函数库中的函数,还需要对其头文件进行包含,所以在target_include_directories()
中添加其头文件的路径 :"${PROJECT_SOURCE_DIR}/MathFunctions"
其中PROJECT_SOURCE_DIR
为项目的根目录。
然后,就可以通过头文件包含来使用函数库中的函数了。
reference:
cmake-tutorial:add library
https://blog.csdn.net/lz_equal/article/details/52439441