CMake学习

Step 1: A Basic Starting Point — CMake 3.23.0-rc5 Documentation

入门:cpp构建可执行文件

1.把.cxx和CmakeList.txt放在一个目录下,称作”source_path“。

为了看cmake中各个参数怎么设置,不同于教程中项目名称和可执行文件名称都设置的一样,我自己的CmakeList.txt中项目名称和可执行文件用了不一样的名字。

1
2
3
4
5
6
7
8
cmake_minimum_required(VERSION 3.10)

# 设置项目名 为"zffproject"
project( zffproject )

# 添加可执行目标,可执行目标文件命名为"zffTutorial_exe",source文件名为"tutorial.cxx"
add_executable(zffTutorial_exe tutorial.cxx)

可以新建一个build目录,称作”build_path“,在build目录下对源码目录执行

1
2
cmake "source_path"
即 cmake ../Step1

就可以”配置项目并生成原生构建系统“(configure the project and generate a native build system),在build_path中会出现项目配置相关的文件。(在哪个文件夹下执行cmake就会在哪个文件夹下生成bulid相关的文件)

2.然后执行

1
cmake --build "build_path" 

然后调用该构建系统来实际编译项目,在build_path中会生成可执行文件。

编译好的可执行文件在build 目录下 , ./”编译好的可执行文件”就可以使用啦!

3.官方给的程序中的相关补充知识

C/C++ argc 和argv - 知乎 (zhihu.com)

argc ,argument count, 可执行文件在命令行中执行时,命令行传入的参数个数,包括可执行文件本身。

argv 是 argument vector的缩写表示传入main函数中的参数列表,其中argv[0]表示这个程序的名字。

1
int mian(int argc, char* argv[])
1
int main(int number, char const *para[])

版本号和配置头文件、指定cpp标准

1.相比于入门中的CmakeList.txt,这个CmakeList.txt中设置了项目的版本号,并且配置头文件把版本号传递给source code

2.配置的文件将被写到binary tree目录下(CMakeCache.txt所在的目录,即build目录),所以必须将那个目录添加到include搜索路径列表中。注意target_include_directories当中的写法,因为要找到build目录,所以使用zffTutorial_exe文件名作为参数,因为这个文件在build目录中,并且名字具有辨识度。

target_include_directories(zffTutorial_exe PUBLIC "${PROJECT_BINARY_DIR}" )

3.给项目添加一些C++11特性,在tutorial.cxx中用std::stod替换atof。同时,删除#include<cstdlib>

在sou/home/workspace/feifeizhang/CMake-master/Help/guide/tutorial/Step1/zffTutorialConfig.h.in /home/workspace/feifeizhang/CMake-master/Help/guide/tutorial/Step1_build/zffTutorialConfig.h /home/workspace/feifeizhang/CMake-master/Help/guide/tutorial/Step1/tutorial.cxxrce code中创建zffTutorialConfig.h.in,包含以下内容,设置版本号,@zffproject_VERSION_MAJOR@打头的前缀必须为项目名称

1
2
3
4
// 该教程的配置选项和设置
#define project_VERSION_MAJOR @zffproject_VERSION_MAJOR@
#define project_VERSION_MINOR @zffproject_VERSION_MINOR@

cmake ../Step1的时候会在build目录下生成.h文件

CmakeLists.txt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
cmake_minimum_required(VERSION 3.10)

# 设置项目名和版本号
project( zffproject VERSION 1.5)

# 指定cpp标准,确保将CMAKE_CXX_STANDARD声明添加到add_executable的上面
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)


# 添加可执行目标
add_executable(zffTutorial_exe tutorial.cxx)

configure_file(zffTutorialConfig.h.in zffTutorialConfig.h)
target_include_directories(zffTutorial_exe PUBLIC
"${PROJECT_BINARY_DIR}"
)

编译后的执行结果

1
2
3
./zffTutorial_exe
./zffTutorial_exe Version 1.5
Usage: ./zffTutorial_exe number

Step 2: Adding a Library — CMake 3.23.0-rc5 Documentation

此小节中库的可选项,我编译之后没有产生可执行文件

现在,我们将添加一个库到项目中。这个库包含了我们自己实现的计算平方根的算法。之后的可执行文件可以使用这个库而不是编译器提供的标准平方根函数。

MathFunctions目录中创建CMakeLists.txt文件,并将下面这行添加到MathFunctions目录中的CMakeLists.txt文件中:

1
add_library(MathFunctions mysqrt.cxx)

为了在源码中使用我们自己定义的平方根函数,需要在上层的CMakeLists.txt中做相应的修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
作者:被包养的程序猿丶
链接:https://zhuanlan.zhihu.com/p/119426899
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

cmake_minimum_required(VERSION 3.10)

# set the project name
project(CalculateSqrt VERSION 1.0)
configure_file(CalculateSqrtConfig.h.in CalculateSqrtConfig.h)

# specify the C++ standard
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

# add the MathFunctions library,Add a subdirectory to the build,将新加的子目录用于build
add_subdirectory(MathFunctions)

# add the executable
add_executable(CalculateSqrt calculate.cpp)

# 该指令的作用为将目标文件与库文件进行链接
# target_link_libraries官方文档:https://cmake.org/cmake/help/latest/command/target_link_libraries.html
target_link_libraries(CalculateSqrt PUBLIC MathFunctions)

target_include_directories(CalculateSqrt PUBLIC
"${PROJECT_BINARY_DIR}"
"${PROJECT_SOURCE_DIR}/MathFunctions"
)