跟着官方教程学CMAKE(一)

废话

最近在看PX4的源代码,其中的项目管理方式就是使用的CMake(貌似实际是ninjia),还有ROS也是使用的Cmake,貌似会使用CMAKE变成了一件很急迫的事情,反正本来Makefile就没有学好,那就干脆跳过那一步(滑稽)。

好了,趁着学生时代的一个学期,再开亿个坑,顺便写个博客来督促一下自己。

开始

CMake是一种自动化构建工具,是一种比makefile更高层次的构建工具,让受编写Makefile之苦的人脱离苦海,帮忙生成Makefile或者一些IDE的项目工程如VS、Code::Blocks,类似的工具还有Ninja,Automake啥的,Automake只在树莓派上编译打印机驱动时碰到过一次,那次还失败了。

而且既然要学就学最正统的,那就跟着官网来吧。
官网的手把手教程

在我敲下键盘打进这个字的时候,这个教程更新到了3.17.0,我Ubuntu里装的cmake的版本是3.10.0,不过根据我学习IT这几年的经验来说,它的新内容我大概率也用不到(不能抱有这种心态,反思)。

这里要说一句,像是Makefile和CMake这样的工具不仅仅可以用在源码编译这样的事情上,他们都可以处理很广泛的计算机自动化任务。

官网一共分了12步,这里也预期分为12篇来学习,在教程中给出的源代码都可以在cmake的源代码中找到,并且按照步骤给出了目录。
官网源代码地址

第一步

首先先把官网提供的第一步的源代码下载下来。
CMake工程的文件一般都叫做CMakeLists.txt,CMake命令执行时会去目标文件夹下面寻找这个文件。
对于一个从源代码构建构建可执行文件的工程来说,一个基本的CMakeLists.txt文件,需要基本的三行代码。

一个基本的CMakeLists.txt文件

在源代码目录下新建一个CMakeLists.txt,然后新建一个文件夹build,这个文件夹是存放cmake构建过程中产生的文件的,这样删除CMake的构建的项目,只需要删掉build文件夹即可。在CMakeLists.txt添加。

# 来自官网
cmake_minimum_required(VERSION 3.10)

# 设置项目名称
project(Tutorial)

# 添加可执行文件
add_executable(Tutorial tutorial.cxx)

这里像是C语言函数的东西都是CMake的Command,他们的具体用法都可以在这里找到:
CMake命令
这里的命令使用的是小写,但实际上,大写,小写,大小写混合都是可以的,和SQL一样。

cmake_minimum_required(VERSION 3.10)

这个是申明执行这个CMakeLists.txt文件所需要的CMake的最小版本,一般编写的时候考虑兼容性,用哪个版本开发,这里就写什么。

project(Tutorial)

申明项目的名称,除此之外还可以在这里申明项目的版本

project(Tutorial VERSION 1.0)

这是CMake提供的管理版本的方法,当然用GIT管,在代码中申明版本,怎么样都可以啦,但是CMake管理有更大的好处,那就是代码替换,这个之后再说。

add_executable(Tutorial tutorial.cxx)

这个就是添加需要编译的文件了,官网提供的是一个开平方根的代码。

配置头文件

动态的配置项目用是CMake的一个很大的优点,就比如这个例子。
首先现在源代码文件的目录下面新建一个头文件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

configure_file(TutorialConfig.h.in TutorialConfig.h)

确保你的project命令中,添加了版本信息,这样,当CMake运行到configure_file命令的时候,会生成TutorialConfig.h,并且用当前的版本信息替换@Tutorial_VERSION_MAJOR@和@Tutorial_VERSION_MINOR@(它可以替换所有文件)
由于头文件默认生成在构建缓存中(当然它是可以修改的),所以必须要添加一个头文件路径,也就是指定编译时的-I FLAG,所以继续修改CMakeLists.txt,修改过后的版本是这样的。

cmake_minimum_required(VERSION 3.10)
# 设置项目名称
project(Tutorial VERSION 1.0)
# 配置头文件
configure_file(TutorialConfig.h.in TutorialConfig.h)
# 添加可执行文件
add_executable(Tutorial tutorial.cxx)

target_include_directories(Tutorial PUBLIC
                           "${PROJECT_BINARY_DIR}"
                           ) 

接下来修改tutorial.cxx,让其包含头文件,并且添加一个输出语句,在参数不足的情况下输出具体的版本和使用说明。

/*最终的样子*/
#include <cmath>
#include <iostream>
#include <cstdlib>
#include <string>
#include "TutorialConfig.h"
int main(int argc, char* argv[])
{
  if (argc < 2) {
    // report version
    std::cout << argv[0] << " Version " << Tutorial_VERSION_MAJOR << "."
              << Tutorial_VERSION_MINOR << std::endl;
    std::cout << "Usage: " << argv[0] << " number" << std::endl;
    return 1;
  }
  // 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;
}

接下来就可以尝试构建一下了,进入build文件夹,构建工程

cd build
cmake .. -G "指定的项目工程"	#支持的工程列表可以在cmake --help中查看支持的项目工程
make						#对应平台的编译命令,又或者打开对应的项目工程

然后就会生成指定的项目工程,如果是Makefile,再键入一次make就可以编译了。(这里再说一下你也可以使用cmake-gui来进行可视化的构建,如opencv等使用GUI还是很方便的),如果想要取消这次的构建结果,删除build文件夹即可。
我们来测试一下结果

# 有参数
>Tutorial.exe 156
The square root of 156 is 12.49

# 没有参数
>Tutorial.exe
Tutorial.exe Version 1.0 # 这个版本号是生成的头文件中的,你可以在build文件夹中找到这个头文件
Usage: Tutorial.exe number

指定C++标准

有些c++编译器默认不支持c++11的标准,而你的源代码中用到了c++11的feature,CMake可以自动帮你加上编译选项。
把源文件里的浮点转字符串改为c++11的库。
移除

#include <cstdlib>

然后把

  const double inputValue = atof(argv[1]);

改为

  const double inputValue = std::stod(argv[1]);

我们需要显示的申明正确的编译FLAG,最简单的指明c++标准的方式是使用CMAKE_CXX_STANDARD变量。

project(Tutorial VERSION 1.0)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

像刚才那样执行cmake命令,编译,OK。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值