什么是CMake
编写平台无关的CMakeLists.txt文件来定制整个编译流程,再根据目标用户的平台进一步生成本地化的Makefile和工程文件。
linux下CMake编译流程:
- 编写CMakeLists.txt
- 执行命令
cmake PATH或者ccmake PATH生成Makefile,其中PATH是CMakeLists.txt所在的目录。 - 使用
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)
命令介绍:
cmake_minimm_required: 指定运行此配置所需要的CMake的最低版本project: 参数是demo1,表示项目的名称是demo1add_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})