介绍
之前讲的Makefile的配置跟你当前的系统非常强的相关,例如在Linux或苹果下配置完Makefile,放到Windows下就会有问题,因为编译器会不同、路径会不同等。
如果要做跨平台的软件,要给不同的操作系统,不同的编译环境里写不同的Makefile,这非常繁琐。
这里还是以之前Makefile的例子进行介绍。
一共有四个源程序:main.cpp,printhello.cpp,factorial.cpp,functions.h
首先是main.cpp内容
#include<iostream>
#include"functionals.h"
using namespace std;
int main()
{
printhello();
cout << "This is main:" << endl;
cout << "The factorial of 5 is: " << factorial(5) << endl;
return 0;
}
调用两个函数
printhello.cpp内容
#include<iostream>
#include"functionals.h"
using namespace std;
void printhello()
{
int i;
cout << "Hello World!" << endl;
}
定义了一个函数,输出hello
factorial.cpp内容
#include"functionals.h"
int factorial(int n)
{
if(n == 0 || n == 1){
return 1;
}
else{
return n * factorial(n - 1);
}
}
定义了一个函数,用于计算阶乘
functions.h内容
#ifndef _FUNCTIONALS_H_
#define _FUNCITIONALS_H_
void printhello();
int factorial(int n);
#endif
在这个文件里写了函数的声明
CMake
首先需要一个CMakeLists.txt,这是CMake的配置文件
第一行是最小支持什么版本,如果用到了CMake高级特性,就要按直接的版本。
第二行是项目名
第三行是在project里加上可执行的hello程序,hello程序依赖后面三个cpp
cmake_minimum_required(VERSION 3.10)
# set the project name
project(hello)
# add the executable
add_executable(hello main.cpp factorial.cpp printhello.cpp)
然后在命令行运行cmake .
,cmake就会在当前目录下找CMakeLists.txt
CMake会找你的C语言编译器是什么,C++编译器是什么,查一查C语言编译器的编译选项,C++编译器的编译选项,最后是配置查询完毕,生成完毕,生成一系列文件:CMakeCache.txt,目录CMakeFiles,Makefile文件
这就是我们用CMake的目的,让CMake帮我们生成Makefile
然后我们可以用make
使用CMake生成的Makefile(注意:路径不能有中文,不然生成的Makefile没法make编译,这时要修改好路径名,删掉所有生成的临时文件,重新cmake生成)
但是产生了一堆临时文件,如果想把这些删掉很麻烦。
一个简单的方法就是,创建一个目录build,进入build目录,再用命令cmake ..
,所有的一切都在build目录里生成,这样删除就很方便,直接删除build目录,这就是为什么很多软件在用cmake编译前创建一个build目录
注意:Windows下会报错:
加上-G "MinGW Makefiles"
,例如最后这里将命令改成cmake .. -G "MinGW Makefiles"