(二)CMake 使用头文件

2023-05-16

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(二)CMake 使用头文件 的相关文章

随机推荐

  • npm install 报错:gyp verb `which` failed Error: not found: python

    今天新启动一个项目 xff0c 在 npm install 安装依赖项时出现报错 npm install span class token operator gt span husky 64 span class token number
  • 24_ZYNQ7020开发板_SPI与Qflash芯片读写

    内核中使用spi master表示一个SPI主机控制器 一 SPI控制器驱动 1 xff09 spi master申请与释放 SPI申请 span class token keyword struct span spi master spa
  • python3的input函数实现回车换行,而不是结束输入

    span class token comment 实现回车换行 xff0c 而不是结束 span endstr span class token operator 61 span span class token string 34 34
  • rviz-Ros Wiki官网教程学习笔记(1)-用户指南

    0 rviz介绍 rviz是ROS自带的图形化工具 xff0c 可以很方便的让用户通过图形界面开发调试ROS 参考官网 rviz UserGuide 1 安装 根据自己的版本号 xff0c 在下面选择对应的命令执行 以ROS melodic
  • 轻松搭建CAS 5.x系列(6)-在CAS Server上增加OAuth2.0协议

    概述说明 CAS Server默认搭建出来 xff0c 客户端程序只能按照CAS自身的协议接入 CAS的强大在于 xff0c 有官方的插件 xff0c 可以支持其他的协议 本章节就让CAS Server怎么增加OAuth2 0的登录协议 安
  • 一起DIY四轴飞行器(二)初识飞控大脑

    系统 xff1a Windows 硬件 xff1a xff08 1 xff09 STM32F103C8T6最小系统板 某宝上搜索 STM32F103最小系统 xff0c 如上图所示这样的 xff08 2 xff09 ST LINK v2下载
  • STM32CubeMX基于HAL库点亮LED灯

    开发环境 xff1a Windows 软件 xff1a 1 STM32CubeMX 6 3 0 2 MDK 5 14 一 cubeMX的基本配置 1 选择MCU 2 配置时钟 查看电路图 xff0c 8MHz的高速外部晶振接到 OSCIN
  • 一起DIY四轴飞行器(三)添加实时操作系统--freeRTOS

    开发环境 xff1a Windows 软件 xff1a 1 STM32CubeMX 6 3 0 2 MDK 5 14 一 初识freeRTOS系统 1 什么是FreeRTOS xff1f Free 即免费的 xff0c RTOS 全称是 R
  • ESP8266 初次使用

    一 工具 1 ESP8266 01S 淘宝上搜索ESP8266 01S 引脚说明 xff1a 2 USB转串口 给设备供电3 3V xff08 官方说不要用USB转串口的3 3V xff0c 需要单独供电 xff09 xff0c USB转串
  • ubuntu安装boost

    ubuntu安装boost 系统 Ubuntu 18 04 boost中 xff0c 用到了别的函数库 xff0c 所以为了使用boost中相应的功能 xff0c 需要先安装系统中可能缺失的库 1 卸载已经安装的boost 删除 usr l
  • 简单的状态机图

    一 什么是状态机 xff1f 做产品的时候 xff0c 我们总能遇到一些比较复杂的逻辑问题 比如状态的转换 xff0c 字段状态的确认 xff0c 权限的控制 xff0c 状态的对应 而普通的流程图 xff0c 或时序图 xff0c 更侧重
  • js-对象转基本类型

    起因是收到朋友发的一道题 xff0c 如下 xff1a span class token comment 请在问号处填写你的答案 使下方等式成立 span span class token keyword let span a span c
  • 局域网内wakeonlan远程唤醒其它计算机

    背景 xff1a 需要管理多台计算机 xff0c 所有计算机在一个局域网内 xff0c 并且有的安装了Windows系统 xff0c 有的安装了Linux系统 我们想远程关闭和启动所有计算机 关闭计算机直接通过网络发生操作系统关机命令即可实
  • D3D中的三种Buffer

    在D3D中 针对视窗有三种Buffer 它们分别是 Color Buffer Depth Buffer和Stencil Buffer Color Buffer在D3D中又称为Render Target 意思是最后着色的目标Buffer 就是
  • 创建镜像(更新与构建镜像)

    创建镜像 有时从Docker镜像仓库中下载的镜像不能满足我们的要求 xff0c 此时可以基于这个镜像 xff08 基础镜像 xff09 封装一个自 己的镜像 两种方式 xff1a 更新镜像 xff1a 使用docker commit命令构建
  • (十)CMake链接已有的动态库

    使用一个已经存在的动态库 xff0c 需要用到CMake中两个命令 xff0c 分别是 xff1a link directoriestarget link libraries 下面先介绍以下两个命令的格式及其含义 xff0c 最后是一个使用
  • ROS入门21讲笔记(四)自定义话题消息类型和使用

    除了ROS内置消息外 xff0c 我们还能自定义消息 这一次我们不再与海龟较劲 xff0c 而是自定义一个订阅消息类型 xff0c 让订阅者和发布者通过这个结构进行数据通信 一 如何自定义话题消息 xff1f 话题消息是以 msg结尾的文件
  • ROS入门21讲笔记(七)自定义消息消息类型和使用

    这一节主要是学习如何自定义一个服务类型并使用它 一 如何自定义服务消息 xff1f 服务数据是以 srv结尾的文件 xff0c 是一个用于描述ROS服务信息简单文本文件 xff0c 用于生成不同语言消息的源代码 srv文件存放在packag
  • ROS入门21讲笔记(十二)常用可视化工具

    一 QT类可视化工具 1 1 rqt console rqt console 为显示和过滤ROS信息提供了一个GUI插件 1 2 rqt plot rqt plot使用不同的绘图后端提供数值可视化功能 1 3 rqt Image view
  • (二)CMake 使用头文件

    一 include directories 该命令用于增加一个编译头文件 其基本语法是 xff1a include directories span class token punctuation span span class token