Cmake教程

  • Post author:
  • Post category:其他


Cmake介绍

Cmake是一个跨平台的的编译器,能够输出makefile和project文件

step 1

一个简单的项目的配置是CMakeList.txt是有三行组成:

cmake_minimum_required(VERSION 3.10)
# set the project name
project(Tutorial)
# add the executable
add_executable(Tutorial tutorial.cxx)

cmake_minimum_required:设置版本号

project:设置项目名称和版本号,

project(Tutorial VERSION 1.0)
configure_file(TutorialConfig.h.in TutorialConfig.h):

configure_file(<input> <output> [COPYONLY] [ESCAPE_QUOTES] [@ONLY] [NEWLINE_STYLE [UNIX|DOS|WIN32|LF|CRLF] ])


configure_file

主要实现如下两个功能:



  1. <input>


    文件

    里面的内容全部复制到

    <output>

    文件中;
  2. 根据参数规则,替换

    @VAR@



    ${VAR}

    变量;
  1. COPYONLY

    • 仅拷贝

      <input>


      文件

      里面的内容到

      <output>

      文件,

      不进行变量的替换

  2. ESCAPE_QUOTES

    • 使用反斜杠(C语言风格)来进行转义;
  3. @ONLY

    • 限制替换, 仅仅替换

      @VAR@

      变量, 不替换

      ${VAR}

      变量
  4. NEWLINE_STYLE

    • 指定输入文件的新行格式, 例如:Unix 中使用的是

      \n

      , windows 中使用的

      \r\n

**注意: **

COPYONLY



NEWLINE_STYLE

是冲突的,不能同时使用;


Config.h.in

文件内容



/**
 * This is the configure demo  
 *    - CMAKEDEFINE_VAR1 = @CMAKEDEFINE_VAR1@
 *    - CMAKEDEFINE_VAR2 = @CMAKEDEFINE_VAR2@
 *    - DEFINE_VAR1      = @DEFINE_VAR1@
 *    - DEFINE_VAR2      = @DEFINE_VAR2@
 */

/**
 *  cmakedefine 会根据变量的值是否为真(类似 if)来变换为 #define VAR ... 或  #undef VAR 
 */
#cmakedefine CMAKEDEFINE_VAR1 @CMAKEDEFINE_VAR1@
#cmakedefine CMAKEDEFINE_VAR2 @CMAKEDEFINE_VAR2@


/**
 * define 会直接根据规则来替换
 */
#define DEFINE_VAR1 @DEFINE_VAR1@
#define DEFINE_VAR2 ${DEFINE_VAR2}

**tutorial.cpp ** 文件内容


// 计算平方根的简单程序。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "Config.h"

int main (int argc, char *argv[]) {
  
#ifdef CMAKEDEFINE_VAR1
   fprintf(stdout,"CMAKEDEFINE_VAR1 = %d\n", CMAKEDEFINE_VAR1);
#endif 

#ifdef CMAKEDEFINE_VAR2
   fprintf(stdout,"CMAKEDEFINE_VAR2 = %d\n", CMAKEDEFINE_VAR2);
#endif 

#ifdef DEFINE_VAR1
   fprintf(stdout,"DEFINE_VAR1 = %d\n", DEFINE_VAR1);
#endif 

#ifdef DEFINE_VAR2
   fprintf(stdout,"DEFINE_VAR2 = %d\n", DEFINE_VAR2);
#endif 
 
  return 0;
}



make.sh

保存一些指令(这个非必须)

#!/bin/sh

# 删除一些产生的文件
rm -rf CMakeFiles
rm cmake_install
rm Makefile
rm Config.h
rm DEMO
rm CMakeCache.txt
rm -rf ./vscode
rm cmake_install.cmake

cmake ./
make

./DEMO

3.1 运行

sh make.sh

  • 生成一个

    Config.h

    配置文件,文件内容为:

/**
 * This is the configure demo  
 *    - CMAKEDEFINE_VAR1 = 1
 *    - CMAKEDEFINE_VAR2 = 0
 *    - DEFINE_VAR1      = 1
 *    - DEFINE_VAR2      = 0
 */

/**
 *  cmakedefine 会根据变量的值是否为真(类似 if)来变换为 #define VAR ... 或  #undef VAR 
 */
#define CMAKEDEFINE_VAR1 1
/* #undef CMAKEDEFINE_VAR2 */


/**
 * define 会直接根据规则来替换
 */
#define DEFINE_VAR1 1
#define DEFINE_VAR2 0


  • 终端显示:

.....

Scanning dependencies of target DEMO
[ 50%] Building CXX object CMakeFiles/DEMO.dir/tutorial.cpp.o
[100%] Linking CXX executable DEMO
[100%] Built target DEMO
CMAKEDEFINE_VAR1 = 1
DEFINE_VAR1 = 1
DEFINE_VAR2 = 0


四、参考链接


https://cmake.org/cmake/help/v3.14/command/configure_file.html?highlight=cmakedefine



版权声明:本文为CodeMyDream原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。