CMake中add_executable的使用

news2024/9/24 5:24:04

      CMake中的add_executable命令用于使用指定的源文件向项目(project)添加可执行文件,其格式如下:

add_executable(<name> [WIN32] [MACOSX_BUNDLE]
               [EXCLUDE_FROM_ALL]
               [source1] [source2 ...]) # Normal Executables
add_executable(<name> IMPORTED [GLOBAL]) # Imported Executables
add_executable(<name> ALIAS <target>) # Alias Executables

      1.Normal Executables:添加一个名为<name>的可执行目标(executable target),该目标将从命令调用中列出的源文件中构建(built)。<name>对应于逻辑目标名称,并且必须在项目中全局唯一(globally unique).生成的可执行文件的实际文件名是基于本机平台(native platform)的约定构建的(例如<name>.exe或仅<name>).
      add_executable的源参数可以使用语法为$<...>的"generator expressions"。
      如果以后使用target_sources命令添加源文件,则可以省略这些源文件。
      默认情况下,将在与调用命令的源树目录相对应的构建树目录中创建可执行文件(the executable file will be created in the build tree directory corresponding to the source tree directory in which the command was invoked)。可以使用RUNTIME_OUTPUT_DIRECTORY目标属性更改此位置。可以使用OUTPUT_NAME目标属性更改<name>到最终文件名。
      如果给定了WIN32,则将在创建的目标上设置WIN32_EXECUTABLE属性.
      如果给出了MACOSX_BUNDLE,则将在创建的目标上设置相应的属性。
      如果给出了EXCLUDE_FROM_ALL,则将在创建的目标上设置相应的属性。

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
add_executable(sample_add ${CMAKE_CURRENT_SOURCE_DIR}/source/add.cpp ${CMAKE_CURRENT_SOURCE_DIR}/samples/sample_add.cpp)
if(TARGET sample_add)
    message("target: sample_add") # print
endif()

      2.Imported Executables:一个IMPORTED可执行目标引用位于项目之外的可执行文件。不会生成任何规则来构建它,并且IMPORTED目标属性为True.目标名称在创建它的目录及其下的目录中具有作用域(has scope),但是GLOBAL选项扩展了可见性。可以像在项目中构建的任何目标一样引用它。IMPORTED可执行文件对于从 add_custom_command之类的命令中方便地引用很有用。导入的可执行文件通过设置名称以IMPORTED_开头的属性来指定。最重要的此类属性是IMPORTED_LOCATION(及其配置的版本IMPORTED_LOCATION_<CONFIG>),它用于指定主可执行文件在磁盘上的位置。

add_executable(xxxx IMPORTED)
if(TARGET xxxx)
    message("target: xxxx") # print
endif()

      3.Alias Executables:创建一个别名目标(Alias Target),以便<name>可用于在后续的命令中引用<target>。<name>不会作为make目标出现在所生成的构建系统中。<target>可能不是ALIAS。
      An ALIAS can target a GLOBAL Imported Target.
      An ALIAS can target a non-GLOBAL Imported Target.这种别名的作用域是创建它的目录和子目录。ALIAS_GLOBAL目标属性可以用来检查别名是不是全局的。
      ALIAS目标可用作目标,以从中读取自定义命令和自定义目标的可执行文件的属性。也可以使用常规的if(TARGET)子命令测试它们的存在。<name>不能用来修改<target>的属性,即,它不能用作set_property, set_target_properties,target_link_libraries等命令的操作数。ALIAS目标不能被安装或导出

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
add_executable(sample_subtraction ${CMAKE_CURRENT_SOURCE_DIR}/source/subtraction.cpp ${CMAKE_CURRENT_SOURCE_DIR}/samples/sample_subtraction.cpp)
add_executable(yyyy ALIAS sample_subtraction)
if(TARGET yyyy)
    message("target: yyyy") # print
endif()
if(TARGET sample_subtraction)
    message("target: sample_subtraction") # print
endif()

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

      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)

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

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

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

 

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

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

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

相关文章

芯片漫游指南(1)-- UVM世界观

目录1 uvm中的学习内容2 类库地图3 工厂机制3.1 工厂的意义3.2 工厂提供的便利3.3 覆盖方法4 核心基类4.1 uvm_object4.2 域的自动化4.3 拷贝&#xff08;copy&#xff09;4.4 比较4.5 打印4.6 打包和解包5 phase机制5.1 概述5.2 phase的九个执行机制5.3 UVM仿真顺序6 config机…

Jenkins安装和配置 (一)

(一) 环境准备 准备一台linux虚拟机&#xff0c;我这里选择的是Ubuntu&#xff0c;安装jdk、maven、git环境 Ubuntu 16.04 虚拟机JDK 1.8MAVEN 3.3.9GIT (二) Jenkins下载安装 Jenkins安装支持以下几种方式&#xff1a; npm包下载安装war包下载安装docker镜像下载安装 这里我…

开发一个简单的http模板之序章

流程 1.当通过开发HTTP模块来实现产品功能时&#xff0c;是可以完全享用Nginx的优秀设计所带来的、 与官方模块相同的高并发特性的。不过&#xff0c;如何开发一个充满异步调用、无阻塞的HTTP模块 呢2. 需要把程序嵌入到Nginx中&#xff0c;也就是说&#xff0c;最终编译出的二…

考虑阶梯式碳交易机制与电制氢的综合能源系统热电优化(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f4dd;目前更新&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;电力系统相关知识&#xff0c;期刊论文&…

【YOLO系列改进NO.45】首发最新特征融合技术RepGFPN(DAMO-YOLO)

文章目录前言一、解决问题二、基本原理三、​添加方法四、总结前言 作为当前先进的深度学习目标检测算法YOLOv7&#xff0c;已经集合了大量的trick&#xff0c;但是还是有提高和改进的空间&#xff0c;针对具体应用场景下的检测难点&#xff0c;可以不同的改进方法。此后的系列…

[附源码]计算机毕业设计springboot云南美食管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

语义分割在线标注思路

语义分割选择使用多边形框标注&#xff0c;相对于物体检测它多了一项计算mask掩膜的需求。 一个图片&#xff0c;可能会进行多项标注。每项标注里面都会在物体检测的格式基础上增加mask属性&#xff0c;mask解释为图像掩膜&#xff0c;里面存与图像宽高对应大小的二维数组。 此…

什么是蛋白质组学?

导读 本文[1] 将从蛋白质组学的定义&#xff0c;蛋白质组包含的类型&#xff0c;常用技术&#xff0c;面临的挑战等方面&#xff0c;对蛋白质组学进行一个简要的介绍。 1. 定义 “蛋白质组学”一词于 1995 年首次出现&#xff0c;被定义为对细胞系、组织或生物体所有蛋白质的大…

Vue-router 路由间参数传递看完让你明明白白!

目录概述路由传参的两大载体分类声明式路由 【router-link 】编程式路由 【this.$router.push()】传参的方式1. 通过 params 传递参数配置路由参数字段占位&#xff08;编程式路由实现&#xff09;配置路由参数字段占位&#xff08;声明式路由实现&#xff09;无需配置路由参数…

Spring框架(四):Spring命名空间和配置标签

Spring框架&#xff08;四&#xff09;&#xff1a;Spring命名空间和配置标签命名空间介绍配置标签Beans标签DemoImport标签Demoalias标签的Demo和Debug痛定思痛&#xff0c;主要问题出现在自己雀氏不熟悉框架基础、一些面试题&#xff0c;以及sql的使用淡忘了。本章节的开始是…

剩余内存无法满足申请时,系统会怎么做?

文章目录前言内存的分配机制回收可回收内存的类型如何在保证系统性能前提下回收内存可回收类型角度: 调整文件页回收倾向回收的方式角度: 尽早触发kswapd内核线程从计算机CPU架构角度: 采用NUMA如何保护进程不被OOM杀掉总结前言 当我们向操作系统申请内存时候,是否有想过一个问…

Bootstrap页面整合(十二)

首先引入bootstrap&#xff1a; 复制导航条代码&#xff1a; 修改导航条&#xff1a; 删除 改完的导航条&#xff1a; <!--导航条--> <nav class"navbar navbar-inverse"><div class"container-fluid"><!--屏幕自适应的--><d…

【吴恩达机器学习笔记】十、支持向量机

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4e3;专栏定位&#xff1a;为学习吴恩达机器学习视频的同学提供的随堂笔记。 &#x1f4da;专栏简介&#xff1a;在这个专栏&#xff0c;我将整理吴恩达机器学习视频的所有内容的笔记&…

神经气体网络(NGN)和不断增长的神经气体网络(GNGN)研究(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

[附源码]计算机毕业设计springboot影评网站系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Python案例实战,gopup模块,Python3行代码就能获取海量数据

前言 今天给大家分享一个三行代码就能获取海量数据 包含了有指数数据、宏观经济数据、新经济数据、微博KOL数据、信息数据、生活数据、疫情数据等。 开发工具 Python版本&#xff1a; 3.6.4 相关模块&#xff1a; gopup模块 环境搭建 安装Python并添加到环境变量&#…

Linux权限管理(umask、粘滞位)

目录 Linux权限管理 文件访问权限的相关设置方法 目录的权限 umask 粘滞位 Linux下有两种用户&#xff1a;超级用户&#xff08;root&#xff09;、普通用户。 超级用户&#xff1a;可以再linux系统下做任何事情&#xff0c;不受限制 普通用户&#xff1a;在linux下做有限…

闲鱼话术,必须收藏

今天分享&#xff1a;闲鱼卖货&#xff0c;常用的客服话术。建议收藏 很多学员&#xff0c;货也上了&#xff0c;有人咨询的时候忽然手忙脚乱&#xff0c;懵啊&#xff0c;怎么感觉没人问期待有人问&#xff0c;有人问&#xff0c;自己啥也说不出来了呢?哈哈&#xff0c;不知…

【BOOST C++ 19 应用库】(6)序列数据封装和优化

一、说明 用于优化的包装函数&#xff1a;本节介绍包装函数以优化序列化过程。这些函数标记对象以允许 Boost.Serialization 应用某些优化技术。 二、示范和代码 示例 64.14。在没有包装函数的情况下序列化数组 #include <boost/archive/text_oarchive.hpp> #include &…

[附源码]计算机毕业设计springboot医院门诊管理信息系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…