在文件夹下编译单个文件,要编译的是tutorial.cxx
这个文件。
其中CMakeLists.txt 文件内容如下:
cmake_minimum_required(VERSION 3.10)
#set the project name and version
project(Tutorial)
#add the executable
add_executable(Tutorial tutorial.cxx)
在命令行输入
cmake .
在当前文件夹下编译得到Makefile 和一大堆中间文件。
再编译一下
make
该路径下会多了一个Tutorial
的可执行文件。
使用project()
命令给定版本号
3 #set the project name and version
4 project(Tutorial VERSION 1.0)
配置头文件并把版本号传给源码:
configure_file(TutorialConfig.h.in TutorialConfig.h)
配置的文件会被写入二叉树,需要把当前路径
9 #add the include directories
10 target_include_directories(Tutorial PUBLIC "$(PROJECT_BINARY_DIR)")
target_include_directories()
用于编译给定target的时候指定include头文件目录。这个target是先要通过 add_executable()
或者add_library()
先生成的。而且这个target不能是ALIAS target(不能是别名),通过使用AFTER|BEFORE 可以选择附加还是预附加。INTERFACE|PUBLIC|PRIVATE 是为了给定target属性,后面的items就是头文件目录了。
target_include_directories( [SYSTEM] [AFTER|BEFORE]
[items1...]
[ [items2...] ...])
在这里说明一下PROJECT_BINARY_DIR
和PROJECT_SOURCE_DIR
这俩变量的区别,如果如上面那个简单的case,源码和CMakeLists.txt 都在一个层级且在这个目录执行cmake ./
或者cmake .
。那生成makefile的和当前源码所在的目录都是当前目录,也就是这种时候以上俩变量一样。如果把源码和CMakeLists.txt放在子目录./src
,并在主目录的子目录的./build
目录下使用cmakecmake ../src
,则cmake生成的makefile和一大堆中间文件都在build文件夹下,PROJCET_BINARY_DIR
=./build
;PROJECT_SOURCE_DIR
=./src
。
编写文件TutorialConfig.h.in
:
// the configured options and settings for Tutorial
#define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@
#define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@
在CMakeLists.txt 中添加如下字段来确定C++ 标准
# specify the C++ standard
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
由于确定了是c++11标准,需要修改源码文件:删除包含#include
,把atof()
替换成 stod()
。(把字符转换成double)
mkdir Step1_build
cd Step1_build
cmake ../Step1 # 配置cmake [包含源码和CMakeLists.txt的路径]
cmake --build . # 编译
这里我自己出了俩小bug
其中一个是
16 #add the include directories
17 target_include_directories(
18 Tutorial PUBLIC "${PROJECT_BINARY_DIR}" #之前错误使用 $(PROJECT_BINARY_DIR)
19 )
修改俩bug就可了。
最后执行的时候
./Tutorial 9