CMake入门实践-多文件构建
在上一节中,我们讲了怎么通过cmake构建一个最简单的HelloWorld项目,但是在实际上面,我们平时遇到的项目都是文件非常多的.这里应该怎么处理呢?这一部分重点解决实际上这个最常见的多个文件构建系统的问题.
一.单目录,多文件
这里直接说例子吧,完整的例子见LearningCMake/2.HelloWorld2/
在HelloWorld2这个项目文件夹下面,我们有4个文件.分别是CMakeList.txt,main.cpp,display.h,display.cpp.其中每个文件的内容如下.
CMakeList.txt
cmake_minimum_required(VERSION 3.9)
project(HelloWord2)
set(CMAKE_CXX_STANDARD 11)
add_executable(HelloWord2 main.cpp display.cpp)
main.cpp
#include <iostream>
#include "display.h"
int main() {
show();
return 0;
}
display.h
//
// Created by xierh on 2018/3/5.
//
#ifndef HELLOWORD2_DISPLAY_H
#define HELLOWORD2_DISPLAY_H
void show();
#endif //HELLOWORD2_DISPLAY_H
display.cpp
#include <iostream>
#include "display.h"
void show()
{
std::cout<<"Hello,World!"<<std::endl;
}
构建的过程还是和第一节编译最简单的HelloWorld项目完全一样的过程.但是这里会发现CMakeList.txt有一个地方不一样.添加执行命令的时候,这里添加了两个源文件
add_executable(HelloWord2 main.cpp display.cpp).这个也是非常好理解的.就是相当于把要编译的源文件放在一起编译.那么到这里,单个目录多个文件的构建其实就说的差不多了.
但是这里还有一个需要补充的地方,非常实用.
比如说,在文件夹下面有非常多个文件,你总不能够一个个都写上去吧.这里有一个好方法可以方便的一起编译非常多个文件.
我们可以使用aux_source_directory命令,该命令会查找指定目录下的所有源文件,然后将结果存进指定变量名。它的使用语法如下
aux_source_directory(<dir> <variable>)
其中dir表示想要查找的目录,variable表示把所有源文件存到这个变量里面.
那么上面的CMakeList.txt可以改写为
cmake_minimum_required(VERSION 3.9)
project(HelloWord2)
set(CMAKE_CXX_STANDARD 11)
aux_source_directory(. source_list)
add_executable(HelloWord2 ${source_list})
依然是能够正确运行的.
二.多目录,多文件
接下来就是生产中常见的多个目录多个文件的环境了.这里虽然会碰到比较多的命令,但是解释之后还是非常好理解的.完整项目代码见LearningCMake/3.HelloWorld3/
首先说下这个项目的结构,其实就是HelloWorld2项目里面的头文件display.h和源文件display.cpp 放到了文件夹function下面.其他的结构完全一样.
那么事实上,CMakeList.txt改成下面的样子就完全能够构建编译通过了.
cmake_minimum_required(VERSION 3.9)
project(3_HelloWorld3)
set(CMAKE_CXX_STANDARD 11)
add_executable(3_HelloWorld3 main.cpp function/display.cpp)
是不是很简单?但是同样的问题是,要是项目文件夹和function文件夹里面的文件都很多怎么办呢?你肯定会想到前面刚刚提到的aux_source_directory命令,没错,这里也要用到这个命令,同时只要做一些非常小的修改就行.
cmake_minimum_required(VERSION 3.9)
project(3_HelloWorld3)
set(CMAKE_CXX_STANDARD 11)
aux_source_directory(. sourceList)
add_executable(3_HelloWorld3 ${sourceList})
然后同样能够非常简单的构建了.
到这里,一些常见的构建方式已经说完了.但是针对实际的生产任务,还有非常多的复杂的功能可以用.可以根据任务的需求设计非常完善的构建系统.这些后面会继续讲到.