Help/guide/tutorial/Step1
目录下有tutorial.cxx
源文件。
在同一目录中有CMakeLists.txt
。
通过TODO 1~3来完成CMakeLists.txt的编写。
#设定cmake版本
cmake_minimum_required(VERSION 3.10)
#project()命令用来设定项目名字
project(Tutorial)
#
add_executable(Tutorial tutorial.cxx)
例如,我们可用进入Helo/guide/tutorial
目录,并创建一个构建目录:
mkdir Step1_build
下一步,进入构建目录,并且运行cmake来配置项目,产生一个构建系统:
cd Step1_build
cmkae ../Step1
然后,调用构建系统来真正编译链接项目:
cmake --build .
这样就可以了。
cmake有许多特殊的变量,可以在项目代码中设定。它们要么是在背后创建的,要么是对cmake有意义。这些变量大多以CMAKE_
开头。当为你的项目创建变量时,尽量避免这种命名约定。
其中,有两个特殊的用户可设置变量:CMAKE_CXX_STANDARD
和CMAKE_CXX_STANDARD_REQUIRED
。它们可以一起用来指定构建项目所需的C++标准。
继续编辑Stpe1目录的文件,,由于我们已经为练习1创建了构建目录,并运行了cmake,因此可以跳到构建步骤:
cd Step1_build
cmake --build .
我们开始为项目添加一些C++ 11特性,如将tutorial.cxx
中的atof
替换为std::stod
,然后移除#include
。
我们需要在cmake中明确声明使用正确的标志。一个开启指定C++标准的方法是,在CMakeLists,txt
中设置CMAKE_CXX_STANDARD
变量,并将CMAKE_CXX_STANDARD_REQUIRED
设置为True
。确保CMAKE_CXX_STANDARD
添加在add_executable()
的上面。
set(CMAKE_CXX_STANDARD 11)
ser(CMAKE_CXX_STANDARD_REQUIRED True)
有时候希望定义在CMakeLists.txt
中的变量能被源代码使用。
比如,我们希望打印项目的版本号(在CMakeLists.txt中定义的)。
实现此目的一种方法是使用已配置的头文件。
我们创建一个输入文件,其中包含一个或多个要替换的变量。这些变量有特殊的语法,格式为@VAR@
。
然后,使用configure_file()
命令将输入文件复制到给定的输出文件,并将这些VAR
变量替换为CMakeLists.txt`中的当前值.
#使用project()命令设置项目名称和版本号
#当调用project()命令时,
#cmake在后台定义Tutorial_VERSION_MAJOR和Tutorial_VERSION_MINOR变量
project(Tutorial VERSION 1.0)
#然后,使用configure_file()复制输入文件,并替换指定的cmake变量
configure_file(TutorialConfig.h.in TutorialConfig.h)
由于配置的文件将写入项目二进制目录,因此我们必须将该目录添加到搜索包含文件的路径列表中。
注意,在本教程中,项目构建目录和二进制目录指的是一个东西,而非意味着是
bin/
这样的目录。
我们使用target_include_directory()
来指定可执行目标应该在哪里查找包含文件。
target_include_directories(Tutorial PUBLIC
"${PROJECT_BINARY_DIR}"
)
Tutorialconfig.h.in 是要配置的输入头文件。当从我们的CMakeLists.txt
调用configure_file ()
时,@Tutial_VERION_MAJOR@
和@Tutial_VERION_MINOR@
的值将被 TutorialConfig.h
中项目的相应版本号所替换。
ToturialConfig.h.in
#define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@
#define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@
最后,在tutorial.cxx中打印版本号:
tutorial.cxx
cout << "Version " << Tutorial_VERSION_MAJOR << "."
<< Tutorial_VERSION_MINOR << endl;