什么是CMake

编写平台无关的CMakeLists.txt文件来定制整个编译流程,再根据目标用户的平台进一步生成本地化的Makefile和工程文件。

linux下CMake编译流程:

  1. 编写CMakeLists.txt
  2. 执行命令cmake PATH或者ccmake PATH生成Makefile,其中PATH是CMakeLists.txt所在的目录。
  3. 使用make命令进行编译

CMakeLists.txt的语法比较简单,由命令,注释和空格组成,其中命令是不区分大小写。#后的内容被认为是注释。 命令由命令名称,小括号和参数组成,参数之间通过空格进行间隔。

编译单个文件

//main.cc
#include<stdio.h>
#include<stdlib.h>

double power(double base, int exponent){
    int result = base;
    int i;
    if (exponent == 0){
        return 1;
    }
    for(i = 1; i < exponent; ++i){
        result = result * base;
    }
    return result;
}
int main(int argc, char *argv[]){
    if(argc < 3){
        printf("Usage: %s base exponent \n", argv[0]);
        return 1;
    }
    double base = atof(argv[1]);
    int exponent = atoi(argv[2]);
    double result = power(base, exponent);
    printf("%g ^ %d is %g\n", base, exponent, result);
    return 0;
}
# CMakeLists.txt
# CMake 最低版本要求
cmake_minimm_required (VERSION 2.8)
# 项目信息
project(demo1)
# 指定生成目标
add_executable(demo main.cc)

命令介绍:

  1. cmake_minimm_required: 指定运行此配置所需要的CMake的最低版本
  2. project: 参数是demo1,表示项目的名称是demo1
  3. add_executable: 将名为main.cc的源文件编译为一个名为demo1的可执行文件

编译:

cmake .
make

多个源文件

目录:

./demo2
    main.cc
    MathFunctions.cc
    MathFunctions.h

CMakeLists.txt

# 设置CMake最低版本号
cmake_minimum_required (VERSION 2.8)
# 设置项目名称
project(demo2)
# 查找目录下所有的源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)
# 指定生成目标
add_executable(demo2 ${DIR_SRCS})

aux_source_directory(PATH NAME)读取PATH下的文件保存到NAME变量中. add_executable(OUT_PUT NAME) OUT_PUT输出的文件,NAME需要编译的文件

多个目录多个源文件

在每个目录下都写一个CMakeLists.txt文件来复制编译。 目录:

./demo3
    math/
        MathFunctions.cc
        MathFunctions.h
    main.cc

CMakeLists.txt

# 设置CMake最低版本号
cmake_minimum_required(VERSION 2.8)
# 设置项目名称
project(demo3)
# 查找目标目录下所有的文件
# 并将名称保存到DIR_SRCS变量中
aux_source_directory(. DIR_SRCS)
# 添加math子目录
add_subdirectory(math)
# 指定生成目录
add_executable(demo ${DIR_SRCS})
# 添加链接库
target_link_libraries(demo MathFunctions)

math/CMakeLists.txt

# 查找当前目录下所有的源文件
# 并添加到DIR_LIB_SRCS变量中
aux_source_directory(. DIR_LIB_SRCS)
# 指定生成MathFunctions链接库
add_library(MathFunctions ${DIR_LIB_SRCS})

results matching ""

    No results matching ""