CMake中add_executable的使用

Posted fengbingchun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CMake中add_executable的使用相关的知识,希望对你有一定的参考价值。

      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

以上是关于CMake中add_executable的使用的主要内容,如果未能解决你的问题,请参考以下文章

CMake 找不到源文件(add_executable)

CMake基础教程(24)add_executable生成目标可执行文件

使用不正确数量的参数调用 Cmake add_executable [重复]

cmake 指令说明

运行cmake时出现CMake Error at CMakeLists.txt:5 (ADD_EXECUTABLE):,怎么解决?

如何使用 CMake 安装脚本?