一、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(.)
运行结果如下:
三、第二个例子
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)
增加头文件所在目录:
include_directories(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...)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)