• CMake中add_executable的使用


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

    1. add_executable( [WIN32] [MACOSX_BUNDLE]
    2. [EXCLUDE_FROM_ALL]
    3. [source1] [source2 ...]) # Normal Executables
    4. add_executable( IMPORTED [GLOBAL]) # Imported Executables
    5. add_executable( ALIAS ) # Alias Executables

          1.Normal Executables:添加一个名为的可执行目标(executable target),该目标将从命令调用中列出的源文件中构建(built)。对应于逻辑目标名称,并且必须在项目中全局唯一(globally unique).生成的可执行文件的实际文件名是基于本机平台(native platform)的约定构建的(例如.exe或仅).
          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目标属性更改到最终文件名。
          如果给定了WIN32,则将在创建的目标上设置WIN32_EXECUTABLE属性.
          如果给出了MACOSX_BUNDLE,则将在创建的目标上设置相应的属性。
          如果给出了EXCLUDE_FROM_ALL,则将在创建的目标上设置相应的属性。

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

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

    1. add_executable(xxxx IMPORTED)
    2. if(TARGET xxxx)
    3. message("target: xxxx") # print
    4. endif()

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

    1. include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
    2. add_executable(sample_subtraction ${CMAKE_CURRENT_SOURCE_DIR}/source/subtraction.cpp ${CMAKE_CURRENT_SOURCE_DIR}/samples/sample_subtraction.cpp)
    3. add_executable(yyyy ALIAS sample_subtraction)
    4. if(TARGET yyyy)
    5. message("target: yyyy") # print
    6. endif()
    7. if(TARGET sample_subtraction)
    8. message("target: sample_subtraction") # print
    9. endif()

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

          build.sh内容如下:

    1. #! /bin/bash
    2. # supported input parameters(cmake commands)
    3. params=(function macro cmake_parse_arguments \
    4. find_library find_path find_file find_program find_package \
    5. cmake_policy cmake_minimum_required project include \
    6. string list set foreach message option if while return \
    7. math file configure_file \
    8. include_directories add_executable add_library target_link_libraries install)
    9. usage()
    10. {
    11. echo "Error: $0 needs to have an input parameter"
    12. echo "supported input parameters:"
    13. for param in ${params[@]}; do
    14. echo " $0 ${param}"
    15. done
    16. exit -1
    17. }
    18. if [ $# != 1 ]; then
    19. usage
    20. fi
    21. flag=0
    22. for param in ${params[@]}; do
    23. if [ $1 == ${param} ]; then
    24. flag=1
    25. break
    26. fi
    27. done
    28. if [ ${flag} == 0 ]; then
    29. echo "Error: parameter \"$1\" is not supported"
    30. usage
    31. exit -1
    32. fi
    33. if [[ ! -d "build" ]]; then
    34. mkdir build
    35. cd build
    36. else
    37. cd build
    38. fi
    39. echo "==== test $1 ===="
    40. # test_set.cmake: cmake -DTEST_CMAKE_FEATURE=$1 --log-level=verbose ..
    41. # test_option.cmake: cmake -DTEST_CMAKE_FEATURE=$1 -DBUILD_PYTORCH=ON ..
    42. cmake -DTEST_CMAKE_FEATURE=$1 ..
    43. # It can be executed directly on the terminal, no need to execute build.sh, for example: cmake -P test_set.cmake
    44. make
    45. make install # only used in cmake files with install command

          CMakeLists.txt内容如下:

    1. cmake_minimum_required(VERSION 3.22)
    2. project(cmake_feature_usage)
    3. message("#### current cmake version: ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION}")
    4. include(test_${TEST_CMAKE_FEATURE}.cmake)
    5. message("==== test finish ====")

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

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

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

     

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

  • 相关阅读:
    【搜索】—— DFS之剪枝与优化
    Abbkine活细胞溶酶体染色试剂盒:高特异性,荧光稳定性强
    vue富文本编辑器wangeditor输入空格回车的必填判断
    【数学建模学习笔记【集训十天】之第八天】
    打开算法之门
    代码随想录 第八章 二叉树02
    《深度探索C++对象模型》阅读笔记 第七章 站在对象模型的尖端
    Go pprof 性能分析工具 - 详细使用图解:
    MySQL DDL数据定义(数据库,表,字段操作)
    19.Xaml Grid控件--->网格控件
  • 原文地址:https://blog.csdn.net/fengbingchun/article/details/128160463