CMake中target_sources的使用

news2024/11/17 15:19:20

      CMake中的target_sources命令用于将源添加到target,其格式如下:

target_sources(<target>
  <INTERFACE|PUBLIC|PRIVATE> [items1...]
  [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...]) # general form

target_sources(<target>
  [<INTERFACE|PUBLIC|PRIVATE>
   [FILE_SET <set> [TYPE <type>] [BASE_DIRS <dirs>...] [FILES <files>...]]...
  ]...) # File Sets

      1.指定构建target和/或其依赖项时要使用的源(sources)。命名的<target>必须由诸如add_executable或add_library或add_custom_target之类的命令创建,并且不能是ALIAS target。<items>可以使用生成器表达式(generator expressions)。
      <target>可以是自定义(custom)target。
      需要INTERFACE, PUBLIC和PRIVATE关键字来指定它们后面的源文件路径(<items>)的范围。PRIVATE和PUBLIC项将填充<target>的SOURCES属性,这些属性在构建target本身时使用。PUBLIC和INTERFACE项将填充<target>的INTERFACE_SOURCES属性,这些属性在构建依赖性时使用。由add_custom_target命令创建的target只能具有PRIVATE范围。
      对相同<target>的重复调用按调用顺序追加项(append items).
      允许使用INTERFACE_SOURCES导出targets.
      允许在IMPORTED targets上设置INTERFACE项。
      相对源文件路径被解释为相对于当前源目录(即CMAKE_CURRENT_SOURCE_DIR)。
      以生成器表达式开头的路径保持不变。当target的SOURCE_DIR属性不同于CMAKE_CURRENT_SOURCE_DIR时,在生成器表达式中使用绝对路径以确保将sources正确分配给target。

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
add_library(add STATIC) # 在build目录下会生成libadd.a
target_sources(add PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/source/add.cpp)

      2.File Sets: 3.23版本中新增内容。将文件集(file set)添加到target,或将文件添加到现有文件集。target具有零个或多个命名文件集。每个文件集都有name, type, INTERFACE, PUBLIC或PRIVATE范围,一个或多个基本目录以及这些目录中的文件。
      可接受的type包括:
      (1).HEADERS:通过语言的#include机制使用的源。
      (2).CXX_MODULES:实验性的。
      (3).CXX_MODULE_HEADER_UNITS:实验性的。
      INTERFACE或PUBLIC文件集中的文件可以使用install(TARGETS)命令安装,并使用install(EXPORT)和export命令导出。
      每个target_sources(FILE_SET)条目都以INTERFACE, PUBLIC或RIVATE开头,并接受以下参数:
      (1).FILE_SET <set>:要创建或添加到的文件集的name.它只能包含字母、数字和下划线。
      (2).TYPE <type>:每个文件集都与特定类型的文件相关联。只能使用上面指定的type,指定任何其它type都是错误的。
      (3).BASE_DIRS <dirs>...:文件集的基本目录的可选列表。任何相对路径都被视为相对于当前源目录(即CMAKE_CURRENT_SOURCE_DIR).
      (4).FILES <files>...:要添加到文件集中的可选文件列表。

      执行测试代码需要多个文件

      build.sh内容如下:

#! /bin/bash

# supported input parameters(cmake commands)
params=(function macro cmake_parse_arguments \
		find_library find_path find_file find_program find_package \
		cmake_policy cmake_minimum_required project include \
		string list set foreach message option if while return \
		math file configure_file \
		include_directories add_executable add_library target_link_libraries install \
		target_sources add_custom_command add_custom_target)

usage()
{
	echo "Error: $0 needs to have an input parameter"

	echo "supported input parameters:"
	for param in ${params[@]}; do
		echo "  $0 ${param}"
	done

	exit -1
}

if [ $# != 1 ]; then
	usage
fi

flag=0
for param in ${params[@]}; do
	if [ $1 == ${param} ]; then
		flag=1
		break
	fi
done

if [ ${flag} == 0 ]; then
	echo "Error: parameter \"$1\" is not supported"
	usage
	exit -1
fi

if [[ ! -d "build" ]]; then
	mkdir build
	cd build
else
	cd build
fi

echo "==== test $1 ===="

# test_set.cmake: cmake -DTEST_CMAKE_FEATURE=$1 --log-level=verbose ..
# test_option.cmake: cmake -DTEST_CMAKE_FEATURE=$1 -DBUILD_PYTORCH=ON ..
cmake -DTEST_CMAKE_FEATURE=$1 ..
# It can be executed directly on the terminal, no need to execute build.sh, for example: cmake -P test_set.cmake
make
# make install # only used in cmake files with install command

      CMakeLists.txt内容如下:

cmake_minimum_required(VERSION 3.22)
project(cmake_feature_usage)

message("#### current cmake version: ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION}")
include(test_${TEST_CMAKE_FEATURE}.cmake)
message("==== test finish ====")

      test_target_sources.cmake内容为上面的所有测试代码段。

      另外还包括三个目录:include,source,samples,它们都是非常简单的实现,仅用于测试,如下:

      可能的执行结果如下图所示: 

 

      GitHub: http://github.com/fengbingchun/Linux_Code_Test

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/72858.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络安全之反序列化漏洞分析

简介 FastJson是alibaba的一款开源JSON解析库&#xff0c;可用于将Java对象转换为其JSON表示形式&#xff0c;也可以用于将JSON字符串转换为等效的Java对象分别通过toJSONString和parseObject/parse来实现序列化和反序列化。 使用 对于序列化的方法toJSONString()有多个重载…

LSTM反向传播原理——LSTM从零实现系列(2)

一、LSTM反向传播介绍 LSTM的反向传播过程相对复杂&#xff0c;主要因为其对应的控制门较多&#xff0c;而对于每一个控制门我们都需要求导&#xff0c;所以工作量较大。 首先我们根据LSTM结构图分析一下每个控制门的求导过程。在讲解反向传播之前&#xff0c;先了解一些要用到…

web课程设计网页规划与设计:鲜花网站设计——基于HTML+CSS+JavaScript制作网上鲜花网页设计(5页)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

redis的热key、大key

目录 1.概述 2.查找方法 2.1.知道具体哪个key有问题 2.2.不知道具体哪个key有问题 3.处理方法 3.1.大key的处理方法 3.2.热key的处理方法 1.概述 大key&#xff1a; 含有较大数据或含有大量成员的Key称之为大Key&#xff0c;常见的大key如&#xff1a; String类型的Ke…

用友降运维成本实践:OceanBase替换MySQL,实现高可用

导语&#xff1a;随着业务模型的不断变化使运维难度越来越大&#xff0c;用友IT内部采用任务调度中心XXL-JOB和配置管理中心Nacos来实现公司IT分布式任务调度和微服务开发。但XXL-JOB和Nacos集群数量的增多又使其支撑系统MySQL难以招架。 为了寻找一款既能提供高可用又能统一管…

git常用命令(linux和windows通用)

本文的命令已可满足日常需求 配置用户信息 git config --global user.name “github用户名” git config --global user.email “github绑定邮箱"查看配置信息 git config --global user.name git config --global user.email~/.bashrc文件介绍 ~指当前用户的根目录&…

负载分担方式的双链路热备份配置

** 负载分担方式的双链路热备份配置 ** 实验要求和拓扑 负载分担方式的优点和主备方式的不同 负载分担可以每个ac都管理ap这样就避免了资源浪费&#xff0c;然后又作到了备份 主备方式则是&#xff0c;ap都交给一个ac&#xff0c;另一个ac只作为备份 实验拓扑 实验要求 配置…

全面上新!阿里 2023 版(Java 岗)面试突击手册,Github 已标星 37K

程序员面试背八股&#xff0c;几乎已经是互联网不可逆的一个形式了。自从面试**八股文火了之后&#xff0c;网上出现了不少 Java 相关的面试题&#xff0c;很多朋友盲目收集背诵&#xff0c;**但网上大部分的面试题&#xff0c;大多存在这几个问题&#xff1a;第一&#xff0c;…

剑指 Offer 53 - II. 0~n-1中缺失的数字

摘要 剑指 Offer 53 - II. 0&#xff5e;n-1中缺失的数字 一、二分法 1.1 二分法分析 排序数组中的搜索问题&#xff0c;首先想到 二分法 解决。 根据题意&#xff0c;数组可以按照以下规则划分为两部分。 左子数组&#xff1a; nums[i]i&#xff1b;右子数组&#xff1a;…

Eolink 11月企业与产品动态速览!

本月&#xff0c;Eolink IDEA 插件 “Eolink ApiKit” 最新版本 1.1.3 发布&#xff0c;可进行方法 API 解析的插件&#xff0c;可自动生成注释&#xff0c;可分析方法出入参等。 此外&#xff0c;Eolink 再获多项荣誉与认证&#xff0c;持续行业领先&#xff01;一起来看看 11…

我今天吃了SHI,请对下联

1. 跨平台终端 Tabby(前身是 Terminus) 是一个可高度配置的终端模拟器和 SSH 或串口客户端&#xff0c;支持 Windows&#xff0c;macOS 和 Linux。 还有一些功能比较常见和易于使用的&#xff1a; 集成了 SSH&#xff0c;Telnet 客户端和连接管理器&#xff0c;可以在 SSH 会…

JAVA SCRIPT设计模式--行为型--设计模式之Mediator中介者模式(17)

JAVA SCRIPT设计模式是本人根据GOF的设计模式写的博客记录。使用JAVA SCRIPT语言来实现主体功能&#xff0c;所以不可能像C&#xff0c;JAVA等面向对象语言一样严谨&#xff0c;大部分程序都附上了JAVA SCRIPT代码&#xff0c;代码只是实现了设计模式的主体功能&#xff0c;不代…

图的初体验

最近周赛有两个差不多的题目&#xff0c;都是关于图的&#xff0c;之前也没有怎么练过关于图的题目&#xff0c;来记录一下。 T1 力扣T320周赛&#xff1a;T3&#xff1a;到达首都的最少油耗 class Solution {//结果long result ;public long minimumFuelCost(int[][] roads…

【推免攻略】四.2021年北交计算机学院夏令营、预推免保研经验

欢迎订阅本专栏&#xff1a;《北交计算机保研经验》 订阅地址&#xff1a;https://blog.csdn.net/m0_38068876/category_10779337.html 【推免攻略】一.北交计算机学院夏令营、预推免攻略【推免攻略】二.联系导师的前期准备及注意事项【推免攻略】三.2020年北交计算机学院夏令营…

如何能成为测试老大?先搞懂项目中的敏捷开发模式

1 什么是敏捷开发&#xff1f; 1、敏捷开发是以用户的需求进化为核心&#xff0c;采取迭代、循序渐进的方式来 进行软件项目的开发。 2、即将项目切分为多个子项目&#xff0c;每个子项目单独发布&#xff0c;保证软件较早可用。 3、及时收集用户反馈&#xff0c;调整未发布…

线性回归线性关系、非线性关系、常见函数导数、损失函数与优化算法、正规方程与单变量函数梯度下降、多变量函数梯度下降

一、线性回归概述 线性回归(Linear regression)&#xff1a;是利用回归方程(函数)对一个或多个自变量(特征值)和因变量(目标值)之间关系进行建模的一种分析方式 特点&#xff1a;只有一个自变量的情况称为单变量回归&#xff0c;多于一个自变量情况的叫做多元回归 特征值与目…

机器学习笔记之受限玻尔兹曼机(五)基于含隐变量能量模型的对数似然梯度

机器学习笔记之受限玻尔兹曼机——基于含隐变量能量模型的对数似然梯度引言回顾&#xff1a;包含配分函数的概率分布受限玻尔兹曼机——场景构建对比散度基于含隐变量能量模型的对数似然梯度引言 上一节介绍了对比散度(Constractive Divergence)思想&#xff0c;本节将介绍基于…

制造型企业如何进行多项目管理?这篇文章说清楚了

受经济全球化与科技迅速发展的影响&#xff0c;我国很多企业早已进入了多项目管理模式。多项目管理是从企业整体出发&#xff0c;动态选择不具有类似性的项目&#xff0c;对企业所拥有的或可获得的生产要素和资源进行优化组合&#xff0c;有效、最优地分配企业资源&#xff0c;…

葡聚糖修饰金纳米颗粒(Dex-AuNps)|聚环氧氯丙烷二甲胺修饰多孔磁性葡聚糖微球

葡聚糖修饰金纳米颗粒(Dex-AuNps)|聚环氧氯丙烷二甲胺修饰多孔磁性葡聚糖微球 产品描述&#xff1a;通过特异性识别作用在表面等离子体共振传感器的金膜表面构建了伴刀豆球蛋白A/葡聚糖修饰金纳米颗粒自组装膜 中文名称&#xff1a;葡聚糖修饰金纳米颗粒 英文名称&#xff1…

CMAKE编译知识

1&#xff0c;Ubuntu安装了cmake之后&#xff0c;直接输入指令查看版本。cmake -version 我这里的版本为3.16.3 2&#xff0c;使用visual studio里面创建一个CMake项目是最快可以看到的。但是一般无法理解。所以我找了网上资料。根据网上所说和自己再试错下。初步了解了cmake…