cmake命令之target_include_directories

2023-11-16

一、介绍

命令格式

target_include_directories(<target> [SYSTEM] [AFTER|BEFORE]
  <INTERFACE|PUBLIC|PRIVATE> [items1...]
  [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])

该命令可以指定目标(exe或者so文件)需要包含的头文件路径。

命名的<目标>必须是由add_executable()或add_library()之类的命令创建的,并且不能是ALIAS目标。通过显式地使用AFTER或BEFORE,就可以在附加和预挂之间进行选择,而不是依赖默认值。

需要INTERFACE、PUBLIC和PRIVATE关键字来指定以下参数的范围。PRIVATE和PUBLIC项将填充<target>的INCLUDE_DIRECTORIES属性。PUBLIC和INTERFACE项将填充<target>的INTERFACE_INCLUDE_DIRECTORIES属性。具体的介绍详见private,public,interface的使用

同时,target_include_directories的参数可以使用语法为$<…>的“生成器表达式”。

二、实例

我们将${OpenCV_Include_dir}头文件库路径添加到了myLib项目

project(myLib)
target_include_directories(myLib PRIVATE ${OpenCV_Include_dir})

生成器表达式的实例

target_include_directories(mylib PUBLIC
  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include/mylib>
  $<INSTALL_INTERFACE:include/mylib>  # <prefix>/include/mylib
)

三、完整的例子

有如下文件的目录,一个math库,main.cc文件来调用math库,math库实现了一个整数的幂运算

 MathFunctions.h

#ifndef POWER_H
#define POWER_H

extern double power(double base, int exponent);

#endif

 MathFunctions.cc

/**
 * power - Calculate the power of number.
 * @param base:	Base value.
 * @param exponent: Exponent value.
 *
 * @return base raised to the power exponent.
 */
double power(double base, int exponent)
{
    int result = base;
    int i;

    if (exponent == 0) {
        return 1;
    }
    
    for(i = 1; i < exponent; ++i){
        result = result * base;
    }

    return result;
}

math下的CMakeLists.txt

cmake_minimum_required (VERSION 2.8)

project(MathFunctions)

# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_LIB_SRCS 变量
aux_source_directory(. DIR_LIB_SRCS)

# 指定生成 MathFunctions 链接库
add_library (MathFunctions ${DIR_LIB_SRCS})

main.cc

#include <stdio.h>
#include <stdlib.h>
#include "MathFunctions.h"

int main(int argc, char *argv[])
{
    if (argc < 3){
        printf("Usage: %s base exponent \n", argv[0]);
        return 1;
    }
    double base = atof(argv[1]);
    int exponent = atoi(argv[2]);
    double result = power(base, exponent);
    printf("%g ^ %d is %g\n", base, exponent, result);
    return 0;
}

 同级目录下的CMakeLists.txt

# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)

# 项目信息
project (Demo3)

# 添加 math 子目录,输出.a文件到output目录
add_subdirectory(math output)

# 指定生成目标
add_executable(Demo main.cc)

# 将子目录的头文件包含到目标中
target_include_directories(Demo PUBLIC math)

# 添加链接库
target_link_libraries(Demo MathFunctions)

编译,运行

 

参考:

target_include_directories — CMake 3.22.0 Documentation

CMake的几种Include_fb_help的专栏-CSDN博客

cmake:target_** 中的 PUBLIC,PRIVATE,INTERFACE - 知乎

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

cmake命令之target_include_directories 的相关文章

随机推荐

  • R语言—列表

    文章目录 列表 定义 创建列表 List 列表 List 元素的引用 列表 List 元素的修改 访问列表元素和值 去列表化 在列表上使用apply系列函数 递归型列表 列表 R语言的6种模式 向量 矩阵 数组 数据框 列表 因子 向量 矩
  • SQLite如何删除,修改、重命名列

    今天在SQLite数据库中添加了一列 后来发现列名写错了 于是使用SQL语句来修改列名 可是根本不管用 首先 请放弃alter吧 sqlite官方说明如下 SQLite supports a limited subset of ALTER
  • 【JS】JavaScript时间与时间戳相互转换

    时间与时间戳相互转换 1 2 时间 JS常用时间类型 1 2 1 GMT 格林尼治标准时 1 2 2 UTC 协调世界时 1 2 3 中国标准时间 1 2 4 ISO8601标准时间格式 1 2 5 时间戳 timestamp 1 时间戳转
  • spring boot项目自动加载引入外部bean

    前言 spring boot项目简化了对外部项目的引入 使我们能够狠方便的构建一个web项目 我们通常在开发的过程中会开发出一些公用的模块组件 这样在项目找那个引入后能够直接使用 减少了轮子的重复构造 同时服务引入的模块化操作 能够更多的节
  • CV学习:OpenCv快速入门(python版)

    本文代码全部可运行 笔者运行环境 python3 7 pycharm opencv4 6 此文是学习记录 记录opencv的入门知识 对各知识点并不做深入探究 文章的目的是让阅读者在极短的时间达到入门水平 在学习过程中 我们应养成 查询op
  • pygame用blit()实现动画效果

    pygame的的实现动画的方法有很多 但是都是围绕着表面进行的 也就是说实现动画的方式不同 但是本质其实都是对表面的不同处理方式而已 原理其实很简单 有点像我们做地铁的时候隧道里的广告一样 我们设置一个窗口 然后让窗口在一个画着很多帧图像的
  • 约束综合中的逻辑互斥时钟(Logically Exclusive Clocks)

    注 本文翻译自Constraining Logically Exclusive Clocks in Synthesis 逻辑互斥时钟的定义 逻辑互斥时钟是指设计中活跃 activate 但不彼此影响的时钟 常见的情况是 两个时钟作为一个多路
  • IDEA从安装到使用--相关配置详解

    IDEA从安装到使用 相关配置详解 作为一个技术小白 刚开始学习使用Intellij IDEA 入门时踩了很多的坑 这里写下我的第一篇博客 分享相关IDEA的配置方法 希望能为各位提供一点帮助 IDEA2018安装及破解 作者 志哥的成长笔
  • 大数(四则运算)

    四则运算 大数加法 高精度加法 大数减法 大数乘法 大数乘法 幂运算 大数乘法 高精度幂运算 大数除法 大数加法 思路 从后往前算 即由低位向高位运算 计算的结果依次添加到结果中去 最后将结果字符串反转 输入的时候两个数都是以字符串的形式输
  • 网站架构演变

    网站架构演变 大型网站介绍 与传统企业应用系统相比 大型互联网网站系统具有以下特点 1 大流量 高并发 这一点往往是传统企业应用系统根本就不会遇到的问题 比如Goole每日访问量都是几十亿 如果服务器端处理不好早就被压的宕机了 2 高可用
  • 环形缓冲区(1)

    声明 参考韦东山视频教程 如若侵权请告知 马上删帖致歉 个人总结 如有不对 欢迎指正 环形缓冲区 环形缓冲区的几个基本操作 申请内存空间 写操作 读操作 环形缓冲区小结 判断缓冲区是否为空 判断缓冲区是否写满 构建环形缓冲区 在 h文件中声
  • 【Augmentation Zoo】RetinaNet + VOC + KITTI的数据预处理-pytorch版

    整合前段时间看的数据增强方法 并测试其在VOC和KITTI数据上的效果 我的工作是完成了对VOC和KITTI数据的预处理 RetinaNet的模型代码来自pytorch retinanet 该项目github仓库在 https github
  • 中标麒麟+达梦数据库 无效的列名[AAAAAAAAAAAAAFS]

    目录 前言 解决办法 中标麒麟 解决办法 windows 前言 今天我将项目部署到中标麒麟服务器 发现原本好使的功能 只要一做添加操作就报如下错误 虽然报错 但数据还是添加了进去 这让我十分费解 解决办法 中标麒麟 问题出现在返回新增结果时
  • Next.js中使用antd修改其组件的默认样式

    在项目中使用了next js搭配了antd 其中需要自定义antd样式 在next js中如果想定义css 我用到的有两种方式 一种是直接使用行内式 div test div 另一种就是写一个css文件后引入 定义一个test module
  • SpringBoot(5)-SpringBoot整合其他项目

    SpringBoot 5 SpringBoot整合其他项目 1 整合Druid数据库连接池 1 1学习地址 1 2application yml 1 3访问一下 1 4随便执行一下新增 2 整合Redis 2 1添加redis pom依赖
  • mimikatz

    https blog gentilkiwi com mimikatz https github com ParrotSec mimikatz
  • C++day1(笔记整理)

    一 Xmind整理 二 上课笔记整理 1 第一个c 程序 hello world include
  • docker 四种网络模型

    一 docker网络基础知识 Docker在创建容器时有四种网络模式 bridge为默认不需要用 net去指定 其他三种模式需要在创建容器时使用 net去指定 bridge模式 使用 net bridge指定 默认设置 none模式 使用
  • java各类型String,int,char,long,StringBuilder,StringBuffer,Integer之间的转换总结

    String和char类型之间的转换 1 String char 因为String是字符串 而char是单个字符 只能把String 转化为char数组 方法为 char ch str toCharArray 2 char String 方
  • cmake命令之target_include_directories

    一 介绍 命令格式 target include directories