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[@]}; doecho "  $0 ${param}"doneexit -1
}if [ $# != 1 ]; thenusage
fiflag=0
for param in ${params[@]}; doif [ $1 == ${param} ]; thenflag=1breakfi
doneif [ ${flag} == 0 ]; thenecho "Error: parameter \"$1\" is not supported"usageexit -1
fiif [[ ! -d "build" ]]; thenmkdir buildcd build
elsecd build
fiecho "==== 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

CMake中add_executable的使用相关推荐

  1. CMake 中的 PUBLIC,PRIVATE,INTERFACE

    一.概述 CMake中经常会使用 target_**() 相关命令,target_**() 命令支持通过 PUBLIC,PRIVATE 和 INTERFACE 关键字来控制传播.本文主要介绍下这三个关 ...

  2. CMake中执行shell命令之execute_process、add_custom_target和add_custom_command

    背景 以下情况可能需要在CMake中执行shell脚本: cmake未提供的功能而实际构建中又需要时,如获取Linux发行版本 项目构建时需要执行脚本才能完成,如boost构建过程 有的需要shell ...

  3. CMake中target_compile_features的使用

    CMake中的target_compile_features命令用向target添加预期的编译器功能(compiler features),其格式如下: target_compile_features ...

  4. CMake中include指令用法介绍

    转载于:  https://blog.csdn.net/liitdar/article/details/81144461 本文主要介绍CMake中include指令的用法. 1 概述 引用CMake官 ...

  5. CMake中link_directories/target_link_directories的使用

    CMake中的link_directories命令用于添加目录使链接器能在其查找库(add directories in which the linker will look for librarie ...

  6. cmake(二十七)Cmake中target再理解

    cmake翻译手册详解 cmake FAQ问题 一    目录结构 ++++++++++++++目录结构-->'最佳实践'++++++++++++++1)对于一个优秀的程序员而言,不仅仅是'编写 ...

  7. CMake中add_compile_options/target_compile_options的使用

    CMake中的add_compile_options命令用于向源文件的编译添加选项,其格式如下: add_compile_options(<option> ...) 将选项添加到COMPI ...

  8. CMake中target_compile_definitions的使用

    CMake中的target_compile_definitions命令用于向target添加编译定义,其格式如下: target_compile_definitions(<target>& ...

  9. CMake中add_definitions/add_compile_definitions的使用

    CMake中的add_definitions命令用于在源文件的编译中添加-D定义标志,其格式如下: add_definitions(-DFOO -DBAR ...) 将当前目录中的target的定义添 ...

最新文章

  1. 用 Spring Boot 纯手工打造私人云网盘!!!
  2. websocket实现多屏互动_“京东11.11直播超级夜”正式官宣,跨屏互动新玩法燃爆11.11...
  3. 入门C语言20问20答
  4. 《智能家居》培训第六天------2019-01-10
  5. Leetcode--24. 两两交换链表中的结点
  6. dio拦截器 flutter_详解flutter之网络请求dio,请求,拦截器简单示例
  7. 在centos7上使用Docker安装oracle 11g
  8. Pytorch permute()的简单用法
  9. 7款纯CSS3实现的炫酷动画应用
  10. dell笔记本触摸板没反应怎么办,戴尔笔记本触摸面板用不了
  11. Word转图片的方法(两种)
  12. 【树莓派】挂载移动硬盘 使用transmission 刷pt站
  13. 锁(synchronized和Lock)
  14. 阿里数据科学家一次讲透数据中台,15页PPT精华,速转走!
  15. 2021-04-09
  16. RPG Maker MV 计时器的用法
  17. E3ZG_D62传感器 STM32C8T6
  18. React 环境搭建以及创建项目工程(二)
  19. spring boot注解@PostConstruct
  20. Spring Boot连接Oracle数据库驱动加载不上的问题(pom.xml引入ojdbc报错的问题)

热门文章

  1. keyWindows被遗弃的代替方式
  2. 大数据开发、大数据分析、大数据运维主要工作各是什么?哪个好?谢谢?
  3. 中国首家!985大学,布局元宇宙!
  4. #千锋逆战班,ssf# 在千锋“逆战”学习第 28天, 每个人生阶段都需要努力去扮好自己的角色,越努力越轻松,越坚强越幸运! 加油
  5. 考研英语 - word-list-24
  6. 你们还不快来学这几个职场沟通小技巧?
  7. oracle行转列、列转行查询语句
  8. 千兆PHY作为百兆使用时的连接方式
  9. hd5的关闭报错,文件报错等
  10. 提取word中的标题大纲