CMake中add_subdirectory的使用

news2025/1/11 14:03:58

      CMake中的add_subdirectory命令用于将子目录添加到构建,其格式如下:

add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL] [SYSTEM])

      source_dir指定源CMakeLists.txt和代码文件所在的目录。如果它是相对路径,则将相对于当前目录(典型用法)对其进行评估,但它也可能是绝对路径。binary_dir指定放置输出文件的目录。如果它是相对路径,则将相对于当前输出目录进行评估,但它也可能是绝对路径。如果未指定binary_dir,则将在扩展任何相对路径之前使用source_dir的值(典型用法).指定源目录下的CMakeLists.txt文件将在当前输入文件继续处理之前立即被CMake处理(The CMakeLists.txt file in the specified source directory will be processed immediately by CMake before processing in the current input file continues beyond this command)。
      如果提供了EXCLUDE_FROM_ALL参数,则默认情况下,子目录中的target将不包括在父目录的ALL target中,并且将从IDE项目(project)文件中排除。用户必须在子目录中显式构建target。这适用于子目录包含有用但不是必须的项目的单独部分(separate part)(例如一组示例)的情况。通常,子目录应包含自己的project命令调用,以便在子目录中生成完整的构建系统(例如VS IDE解决方案文件)。注意,target间依赖关系取代此排除。如果父项目构建的target依赖于子目录中的target,则依赖对象target将包含在父项目构建系统中以满足依赖关系。
      如果提供了SYSTEM参数,则子目录的SYSTEM目录属性将设置为true。此属性用于初始化在该子目录中创建的每个target的SYSTEM属性。在编译使用者(compiling consumers)时,SYSTEM设置为true的target的include目录将被视为SYSTEM.

add_subdirectory(source) # source目录下必须要有CMakeLists.txt

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
add_executable(main ${CMAKE_CURRENT_SOURCE_DIR}/samples/sample_add.cpp)
target_link_libraries(main add) # add库在build/source目录下,此add库由source目录下的CMakeLists.txt生成

     source目录下的CMakeLists.txt文件内容如下:

cmake_minimum_required(VERSION 3.22)
project(math VERSION 1.2.3)

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../include)
add_library(add SHARED add.cpp) # 将会在build/source目录下生成libadd.so
# set_target_properties(add PROPERTIES VERSION ${PROJECT_VERSION})

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

      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 \
		add_subdirectory aux_source_directory \
		set_property set_target_properties define_property)

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_add_subdirectory.cmake内容为上面的所有测试代码段。

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

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

 

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

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

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

相关文章

毕业设计 - java web 酒店管理系统的设计与实现【源码+论文】

文章目录前言一、项目设计1. 模块设计总体设计具体模块数据库部分设计2. 实现效果二、部分源码项目源码前言 今天学长向大家分享一个 优秀的毕业设计项目: 酒店管理系统的设计与实现 源码获取方式: https://gitee.com/sinonfin/L-javaWebSha/tree/master 一、项目设计 1. 模…

FreeRTOS任务切换过程深层解析

FreeRTOS 系统的任务切换最终都是在 PendSV 中断服务函数中完成的,uCOS 也是在 PendSV 中断中完成任务切换的。 【为什么用PendSV异常来做任务切换】 PendSV 可以像普通中断一样被 Pending(往 NVIC 的 PendSV 的 Pend 寄存器写 1)&#xff…

Spark零基础入门实战(五)使用Eclipse创建Scala项目

本节讲解在Windows中使用Scala for Eclipse IDE编写Scala程序。 安装Scala for Eclipse IDE Scala for Eclipse IDE为纯Scala和混合Scala与Java应用程序的开发提供了高级编辑功能,并且有非常好用的Scala调试器、语义突出显示、更可靠的JUnit测试查找器等。 Scala for Eclip…

重磅首发!腾讯前晚最新爆出的“JVM学习笔记”,GitHub已评“钻级”,看完我爱了!

前言 “JVM”,一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。有了JVM后,Java语言在不同平台上运行时不需要重新编译,为我们提供了极大的便利性,现在在面试当中“JVM”相关的知识是必问…

5分钟部署云计算|云原生监控平台Prometheus-尚文网络xUP楠哥

~~全文共1277字,阅读需约5分钟。 进Q群11372462,领取专属报名福利,包含云计算学习路线图代表性实战训练大厂云计算面试题资料! # Prometheus介绍 Prometheus是由Go编写的时间序列监控数据库,在目前云计算|云原生时代非常流行&am…

分析linux内核qspi驱动层次

【推荐阅读】 需要多久才能看完linux内核源码? 概述Linux内核驱动之GPIO子系统API接口 https://mp.csdn.net/mp_blog/creation/editor/127819883 一篇长文叙述Linux内核虚拟地址空间的基本概括 纯干货,linux内存管理——内存管理架构(建议收藏…

【LeetCode每日一题】——237.删除链表中的节点

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【题目提示】八【时间频度】九【代码实现】十【提交结果】一【题目类别】 链表 二【题目难度】 中等 三【题目编号】 237.删除链表中的节点 四【题目描述】 有一个单链…

[附源码]JAVA毕业设计小区失物招领网站(系统+LW)

[附源码]JAVA毕业设计小区失物招领网站(系统LW) 项目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术…

网红家电逐渐沉寂,家电企业如何利用APS排产调整生产?

随着生活水平的提高,近年来的消费行业逐渐呈现出消费升级、个性化、多元化趋势。在这些趋势下,一大批网红小家电产品迅速出现,以创新性的功能和设计,满足消费者新需求。 近年来,小家电领域已经成为网红爆款产品的集中地…

OpenAI ChatGPT注册步骤(超详细!!!)

最近,很火的OpenAI ChatGPT,大伙都跃跃欲试。 由于注册过程比较麻烦,我整理了一下注册步骤。 一、前期准备: 1、梯子(需要科学上网,准备墙外代理) 2、国外接码平台,推荐sms-activ…

java计算机毕业设计ssm学生课堂考勤小程序947n4(附源码、数据库)

java计算机毕业设计ssm学生课堂考勤小程序947n4(附源码、数据库) 项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xf…

sprites精灵图+字体图标

1、sprites精灵图 使用精灵图就是为了减少网页请求服务器发送图片的次数,把一些小图标都放到一张图片(称为精灵图)精确单位,就不会请求服务器多次了 使用精灵图核心: 精灵技术主要针对于背景图片使用,就是把多个小背景图片整合到…

Qt-数据库开发-外键使用(4)

Qt-数据库开发-使用QSqlRelationalTableModel(关系表模型)来可视化数据库中[外键] 文章目录Qt-数据库开发-使用QSqlRelationalTableModel(关系表模型)来可视化数据库中[外键]1、概述2、实现效果3、主要代码4、完整源代码更多精彩内…

Swift学习笔记笔记(八) 日期选择和表现视图组件的使用

一、实验目的: 1.掌握DatePicker组件的使用 2.掌握TableView组件的使用 3.掌握代码设置属性的方法 二、实验原理: 1.属性面板设置属性的缺点 2.DatePicker中Moder属性的设置方法 3.DatePicker中Locale属性的设置方法 4.随机数函数的原型 5. 运动检测函…

Python-matplotlib画图要点【大总结】

文章目录一、x,y坐标图1、基本操作2、进阶操作(1)解决中文乱码情况(2)调整图像大小(3)加标题、坐标文字、坐标轴标签(5)去掉上边框二、柱状图1、柱状图画图原理2、三、颜色与标记形状…

运筹说 第83期丨我国网络计划奠基人——华罗庚

经过之前的学习,相信大家已经对运筹学的图论的内容有了一定的了解,接下来小编将带你学习新一章的内容,先来看看网络计划的起源发展,然后共同走近我国网络计划奠基人——华罗庚,去领略他不平凡的一生。 01 网络计划起源…

Pr:导出设置之管理显示色域体积及内容光线级别

视频 VIDEO设置因所选导出格式而异。每种格式都有独特的要求,这些要求决定了哪些设置可用。以导出 H.264 文件格式为例,下面给出 HDR 显示器及节目内容显示相关的选项及说明。管理显示色域体积Mastering Display Color Volume对内容进行分级时所使用的 H…

获取pdf中固定位置图片的二维码,然后解析

1、需要引入下面的pom坐标如下​​ ​2.完整代码如下import com.github.binarywang.utils.qrcode.BufferedImageLuminanceSource; import com.google.zxing.BinaryBitmap; import com.google.zxing.EncodeHintType; import com.google.zxing.MultiFormatReader; import com.goo…

itop3568开发板在Linux系统中使用NPU

下载rknpu2并拷贝虚拟机Ubuntu,如下图所示,RKNPU2提供了访问rk3568 芯片 NPU 的高级接口。 下载地址为“iTOP-3568 开发板\02_【iTOP-RK3568 开发板】开发资料\11_NPU 使用配套资料\01_rknpu2 工具” 对于 RK3568 来说,Linux 平台 RKNN SDK 库…

[Spring5.3.2] Servlet[springmvc]的Servlet.init()引发异常, 解析类文件失败

Spring / Spring MVC遇到问题 找了一本spring相关的教材,书上的代码拿过来就能运行,自己写就总报HTTP 500错误,反复检查没有任何一处写错,同一个错误卡了我三天,非常郁闷,今天终于解决了.特此记录. 问题表现: 图中提到的问题: 例外情况 javax.servlet.ServletException: Ser…