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})

然后同样能够非常简单的构建了.

到这里,一些常见的构建方式已经说完了.但是针对实际的生产任务,还有非常多的复杂的功能可以用.可以根据任务的需求设计非常完善的构建系统.这些后面会继续讲到.

猜你喜欢

转载自blog.csdn.net/xierhacker/article/details/79448843