一、include_directories
该命令用于增加一个编译头文件。其基本语法是:
include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])
目录可以是绝对路径也可以是相对路径,相对路径的基准是CMAKE_CURRENT_SOURCE_DIR
,默认情况下,包含目录是从已存在的包含目录列表后追加的,如果你想改变默认行为你可以设置CMAKE_INCLUDE_DIRECTORIES_BEFORE
为ON
,当然你可以直接通过参数AFTER
和BEFORE
控制是向后插入(Appending)还是向前插入(Prepending)。
注:相对路径是相对于当前进行的CMakeLists.txt所在目录,如当前CMakeLists下的include文件夹,可以写成:include_directories(include)
或者带上符号include_directories(./include)
。
二、第一个例子
有如下源文件需要编译,
operation.cpp:
#include "operation.h"
int add(int a,int b)
{
return a+b;
}
operation.h
#ifndef _OPERTION_H
#define _OPERTION_H
int add(int a,int b);
#endif
main.cpp
#include <iostream>
#include "operation.h"
int main()
{
int a=1;
int b=2;
std::cout<<"你好啊,朋友"<<std::endl;
std::cout<<"a+b = "<<add(a,b)<<std::endl;
}
文件结构如下:
. ├── build ├── CMakeLists.txt ├── main.cpp ├── sayHello.cpp └── sayHello.h 1 directory, 4 files
我们采用Out of source编译,这种编译方式意思是在CMakeLists.txt所在目录外(Out)编译,这样做的好处在于生成的中间文件不会“污染”原有的工程结构。
首先我们增加所有参与编译的源文件main.cpp
和operation.cpp
:
add_executable (Demo main.cpp operation.cpp)
再添加头文件operation.h
头文件所在的目录:
include_directories(.)
最终的CMakeLists.txt如下:
add_executable (Demo main.cpp operation.cpp)
include_directories(.) #这个也可以放在add_executable前面
运行结果如下:
三、第二个例子
3.1 工程结构说明
下面我们对工程结构进行一些修改:
. ├── build ├── CMakeLists.txt ├── include │ └── sayHello.h ├── main.cpp └── src └── sayHello.cpp 3 directories, 4 files
我们将打印hello的源文件sayHello.h
和sayHello.cpp
分别存放在src
和include
文件夹中。
sayHello.h
内容如下:
#include <iostream>
void sayHello();//没有做头文件重复包含处理
sayHello.cpp
内容如下:
#include "sayHello.h"
void sayHello()
{
std::cout << "Hello" << std::endl;
}
编译的主函数main.cpp
如下:
#include "sayHello.h"
int main()
{
sayHello();
}
3.2 编写CMakeLists.txt
按照惯例,在工程最前面应该增加CMake最低版本要求,防止因为版本差异造成的问题:
cmake_minimum_required(VERSION 3.16)
工程名自然不能缺少:
project(Demo)
增加源文件:
add_executable(Demo main.cpp src/sayHello.cpp)
# 使用了相对路径,其基准默认为CMAKE_SOURCE_DIR,也就是当前CMakeLists.txt所在目录基础上
# src/sayHello.cpp全写应该为
# add_excutable(Demo ${CMAKE_SOURCE_DIR}/src/sayHello.cpp ${CMAKE_SOURCE_DIR}/src/sayHello.cpp)
# 啰里啰嗦的
增加头文件所在目录:
include_directories(include)
# 也可以写成这样,可以但没必要 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
# 看上去啰里啰嗦的,没有必要
最后整个CMakeLists.txt的内容为:
project(Demo)
cmake_minimum_required(VERSION 3.16)
add_executable(Demo main.cpp src/sayHello.cpp)
include_directories(include)
小结:无论是add_excutable
还是include_directories
其相对路径相对的对象都是CMAKE_CURRENT_SOURCE_DIR
,通常我们会把这个变量省略。
[1] 20201122 include_directories
支持多个包含目录,格式include_directories(dir1 dir2 dir3...)
[2] 20210316 add_excutable
也支持包含多个源文件,格式add_excutable(EXENAME src1 src2 src3...)