cmake使用02:包含一个 头文件和一个源文件的项目
项目包含一个头文件和一个源文件
tutorial.cxx使用到TutorialConfig.h中定义的宏(Tutorial_VERSION_MAJOR , Tutorial_VERSION_MINOR)
- 头文件和源文件在同一目录下:
头文件TutorialConfig.h(定义了两个宏,表示版本号:Tutorial_VERSION_MAJOR ,Tutorial_VERSION_MINOR )
#define Tutorial_VERSION_MAJOR 1
#define Tutorial_VERSION_MINOR 0
tutorial.cxx:计算开方
#include <cmath>
#include <iostream>
#include <string>
#include "TutorialConfig.h"
int main(int argc, char* argv[])
{
if(argc!=2) return -1;
std::cout << Tutorial_VERSION_MAJOR << "."
<< Tutorial_VERSION_MINOR << std::endl;
// convert input to double
const double inputValue = atof(argv[1]);
// calculate square root
const double outputValue = sqrt(inputValue);
std::cout << "The square root of " << inputValue << " is " << outputValue
<< std::endl;
return 0;
}
CMakeLists.txt:
采用add_executable()生成可执行文件,如1处所示。
cmake_minimum_required(VERSION 3.10)
project(Tutorial )
//1.
add_executable(Tutorial tutorial.cxx)
# PROJECT_BINARY_DIR为构建目录,也就是./step2/build/
# target_include_directories(Tutorial PUBLIC "${PROJECT_BINARY_DIR}" )
- 源文件和所需的头文件不在同一目录下
目录结构如下:
./step2/---
|---build/
|--TutorialConfig.h
|---tutorial.cxx
|---CMakeLists.txt
CMakeLists.txt:
这种情况需通过target_include_directories()指定target(此处为可执行文件Tutorial)所需头文件路径。如2.处所示
相当于:g++ tutorial.cxx -o Tutorial
cmake_minimum_required(VERSION 3.10)
project(Tutorial )
add_executable(Tutorial tutorial.cxx)
//2:
target_include_directories(Tutorial PUBLIC "${PROJECT_BINARY_DIR}" )
- 传递cmake变量自动生成头文件TutorialConfig.h.
在之前,TutorialConfig.h中表示版本号的宏定义是我们预先写入该头文件的。
现在我们想要由cmake决定这些宏的值或者宏是否定义。
目录结构如下:
./step2/---
|---build/
|----TutorialConfig.h
|---tutorial.cxx
|---CMakeLists.txt
|----TutorialConfig.h.in
CmakeLists.tx如下:
cmake_minimum_required(VERSION 3.10)
#1. 为项目增加版本号
# 使得cmake内部变量Tutorial_VERSION_MAJOR=1,
# Tutorial_VERSION_MINOR=0
project(Tutorial VERSION 1.0)
# 2. 自定义option变量.
option(USE_MYMATH "Use tutorial provided math implementation" ON)
# 3.. 基于TutorialConfig.h.in生成 TutorialConfig.h
configure_file(TutorialConfig.h.in TutorialConfig.h)
add_executable(Tutorial tutorial.cxx)
target_include_directories(Tutorial PUBLIC "${PROJECT_BINARY_DIR}" )
TutorialConfig.h.in,在该文件中
可以获取cmake内部变量的值,如1处
根据cmake内部的option变量的取值是否为ON定义宏名,如2处。
configure_file(TutorialConfig.h.in TutorialConfig.h)
负责修改TutorialConfig.h.in并生成TutorialConfig.h。
//1.
#define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@
#define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@
//2.
#cmakedefine USE_MYMATH
构建目录./build下执行cmake ..
生成Makefile之外,还生成utorialConfig.h,如下
//1.
#define Tutorial_VERSION_MAJOR 1
#define Tutorial_VERSION_MINOR 0
//2.
#define USE_MYMATH
修改VERSION 1.0
为VERSION 2.1
,重新cmake ..
,你会发现 1处宏定义的值随之更改
执行cmake .. -DUSE_MYMATH=OFF
(修改变量USE_MYMATH的值),你会发现2处将被删除(USE_MYMATH不再定义)
make
构建程序,构建结果目录如下
./step2/---
|---build/
|--Makefile
|--TutorialConfig.h
|---tutorial.cxx
|---CMakeLists.txt
|---TutorialConfig.h.in