(二)CMake 使用头文件

一、include_directories

该命令用于增加一个编译头文件。其基本语法是:

include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])

目录可以是绝对路径也可以是相对路径,相对路径的基准是CMAKE_CURRENT_SOURCE_DIR,默认情况下,包含目录是从已存在的包含目录列表后追加的,如果你想改变默认行为你可以设置CMAKE_INCLUDE_DIRECTORIES_BEFOREON,当然你可以直接通过参数AFTERBEFORE控制是向后插入(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.cppoperation.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前面

运行结果如下:
02

三、第二个例子

3.1 工程结构说明

下面我们对工程结构进行一些修改:

.
├── build
├── CMakeLists.txt
├── include
│   └── sayHello.h
├── main.cpp
└── src
    └── sayHello.cpp

3 directories, 4 files

我们将打印hello的源文件sayHello.hsayHello.cpp分别存放在srcinclude文件夹中。

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

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值