什么是CMake?
大家都知道makefile就是用来管理代码自动化编译的工具,而cmake就是makefile的上层工具,目的正是为了产生可移植的makefile,并简化自己动手写makefile时的巨大工作量。cmake能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake.
一.首先我们来编写一个“Hello World”文件熟悉一下CMake的使用.
1.首先建立一个test目录,在test目录下建立一个文件名为Hello.cpp的文件,并输入下列代码.
**deepin 15.7 下cmake的安装命令为sudo apt-get install cmake **
#include <iostream>
using namespace std;
int main()
{
cout << "Hello World!" << endl;
return 0;
}
2.在test目录下建立一个新的文件CMakeLists.txt,其中输入的内容就是Cmake的执行代码.
CMAKE_MINIMUM_REQUIRED(VERSION 2.8) //Cmake最低版本需求,不加入此行会受到警告信息
PROJECT(test) //项目名称
AUX_SOURCE_DIRECTORY(. SRC_LIST) //把当前目录(.)下所有源代码文件和头文件加入变量SRC_LIST
//AUX_SOURCE_DIRECTORY(<dir> <variable>)函数接受两个参数,收集指定目录中所有源文件的名称,并将列表存储在提供
//的<variable>中.
ADD_EXECUTABLE(Hello ${SRC_LIST}) //自动生成可执行文件Hello,ADD函数将所有源代码文件进行编译
**3.编译项目.
为了使用外部编译方式编译项目,需要先在test目录下新建一个目录,一般命名为build.然后切换到build目录,执行命令
cmake ..
因为上层目录是源文件,所以用..
.然后执行make
,就会生成可执行文件Hello.执行后结果如下:**
如果想要删除cmake生成的文件,可以直接删除build目录,下次编译时再在项目下创建build目录,然后编译就行.
二.多个源文件Cmake的编写.
同一目录下多个源文件
1.在原来的test目录下建立一个Hello.h文件.
#include <iostream>
using namespace std;
void hello() {
cout << "Hello world!" << endl;
}
2.将Hello.cpp改为:
#include <iostream>
#include "Hello.h"
int main()
{
hello();
return 0;
}
原本的CMakeLists.txt文件不变,删除cbuild目录,新建build目录,执行
cmake ..
,然后执行make,执行elf文件.
AUX_SOURCE_DIRECTORY(. SRC_LIST) 这句语法就将当前目录下的所有源代码文件和头文件加入变量SRC_LIST.//把当前目录(.)下所有源代码文件和头文件加入变量SRC_LIST,
不同目录下的多个源文件
程序结构如上图,代码如下:
Hello.h:
#include <iostream>
using namespace std;
void Hello();
//
Hello.cpp:
#include "Hello.h"
void Hello() {
cout << "Hello" << endl;
}
//
World.h:
#include <iostream>
using namespace std;
void World();
//
World.cpp:
#include "World.h"
void World() {
cout << "World!" << endl;
}
//
CMakeLists.txt文件如下:
CMAKE_MINIMUM_REQUIRED(VERSION 2.8) #Cmake最低版本需求,不加入此行会受到警告信息
PROJECT(test) #项目名称
INCLUDE_DIRECTORIES(Hello World)
AUX_SOURCE_DIRECTORY(. SRC_LIST)
AUX_SOURCE_DIRECTORY(Hello SRC_LIST1)
AUX_SOURCE_DIRECTORY(World SRC_LIST2)
ADD_EXECUTABLE(main ${SRC_LIST} ${SRC_LIST1} ${SRC_LIST2})
INCLUDE_DIRECTORIES
函数将给定目录添加到编译器用于搜索包含文件的目录中。相对路径被解释为相对于当前源目录。
其实更加标准一点的写法,会将源文件全部存储在src目录下,所有的头文件放在include目录下。项目的结构如下:
** CMakeLists.txt文件如下:**
CMAKE_MINIMUM_REQUIRED(VERSION 2.8) #Cmake最低版本需求,不加入此行会受到警告信息
PROJECT(test) #项目名称
INCLUDE_DIRECTORIES(include)
AUX_SOURCE_DIRECTORY(src SRC_LIST)
ADD_EXECUTABLE(main ${SRC_LIST})
三.在编译时加入其他选项.
添加编译选项用add_compile_options函数,直接在括号中添加选项。
支持gdb调试:
在CMakeLists.txt文件中加入:
set(CMAKE_BUILD_TYPE "Debug")
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")