程序代码是由头文件源文件组成。

带有main函数的源文件编译成可执行程序,其它的编译成库文件

一个库往往是许多算法程序的集合。在Linux中,库文件分成静态库和共享库两种。静态库以.a作为后缀名,共享库以.so结尾。所有库都是一些函数打包后的集合,差别在于静态库每次被调用时都会生成一个副本,而共享库只有一个副本,更节省空间。

生成静态库的cmake命令:

1
2
# 添加一个库,hello是库名,libHello.cpp是源文件。
add_library(hello libHello.cpp)

这行命令会生成一个libhello.a文件。

生成动态库的cmake命令:

1
2
# 添加一个共享库,SHARED表示“共享”,hello_shared是库名,libHello.cpp是源文件。
add_library(hello_shared SHARED libHello.cpp)

这行命令会生成libhello_shared.so文件。

库文件是一个压缩包,里面有编译好的二进制函数。但是,如果仅有.a.so文件,我们并不知道里面的函数是什么,调用的形式又是怎么样的,为了使用这个库,我们需要提供一个头文件。

因此,对于库的使用者来说,只要拿到了头文件和库文件,就可以调用这个库。如果可执行程序想调用库文件中的函数,则它需要参考该库提供的头文件(即在源.cpp文件中#include <库的头文件>),以明白调用的格式。同时,要把可执行程序链接到库文件上。

相关的cmake命令如下:

1
2
3
4
5
# 使用useHello.cpp源文件生成可执行文件useHello
# useHello.cpp第一行是#include<hello_shared共享库的头文件>
add_executable(useHello useHello.cpp)
# 将可执行文件useHello链接到库hello_shared上
target_link_libraries(useHello hello_shared)

CMakeLists.txt文件用于告诉cmake在这个目录下做什么事情。CMakeList.txt文件的内容需要遵守cmake的语法。

1
2
3
4
5
6
7
# 声明要求最低的cmake版本
cmake_minimum_required(VERSION 3.0)
# 声明一个cmake工程,工程名demo
project(demo)
# 添加一个可执行程序
# 语法:add_executable(程序名 源代码文件)
add_executable(hello hello.cpp)