首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

CMake意外地将最后一个文件名添加到foreach中的可执行文件

CMake是一个跨平台的构建工具,用于管理软件项目的构建过程。它使用名为CMakeLists.txt的文本文件来描述构建过程,并生成适合不同平台和编译器的构建脚本。

在CMakeLists.txt中,可以使用foreach命令来迭代处理列表中的元素。通常,foreach命令的语法是将一个变量和一个列表作为参数,然后在循环体中处理每个列表元素。然而,CMake的foreach命令在处理文件列表时有一个特殊的行为,即将最后一个文件名添加到foreach中的可执行文件。

这个特殊行为可以通过在foreach命令之前使用列表的一部分来避免。例如,假设我们有一个文件列表SOURCES,其中包含要编译的源文件:

代码语言:txt
复制
set(SOURCES
    main.cpp
    file1.cpp
    file2.cpp
    file3.cpp
)

如果我们希望使用foreach命令迭代处理这个列表,并将每个文件编译为可执行文件,可以这样做:

代码语言:txt
复制
set(SOURCES
    main.cpp
    file1.cpp
    file2.cpp
    file3.cpp
)

foreach(source ${SOURCES})
    add_executable(${source} ${source})
endforeach()

在这个例子中,我们使用foreach命令将${source}绑定到${SOURCES}列表中的每个文件名,并使用add_executable命令将每个文件编译为可执行文件。

需要注意的是,CMake的这个特殊行为可能会导致一些意外情况,特别是当最后一个文件名与其他列表中的某个元素重复时。为了避免这种情况,建议在使用foreach命令之前检查列表的内容,并确保最后一个文件名不会造成冲突。

此外,腾讯云也提供了一些与构建和部署相关的产品和服务,例如:

  1. 腾讯云CodePipeline:持续交付服务,帮助实现代码的持续构建、测试和部署。
  2. 腾讯云容器服务:提供容器化应用程序的构建、管理和扩展能力。
  3. 腾讯云Serverless Framework:无服务器应用程序框架,简化了构建、部署和管理无服务器应用程序的过程。

这些产品和服务可以帮助开发者更高效地进行构建和部署工作。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

CMake常用命令一些整理

lib库 1.13 file语法 1.13.1 文件夹所有的类型文件添加到文件列表 例如当前文件夹下所有.cpp文件文件名加入到MAIN_SRC当前文件夹下所有.h加入到MAIN_HDR...*.h) 例如当前文件夹子目录src文件夹下所有.cpp文件文件名加入到MAIN_SRC当前文件夹子目录src文件夹下所有.h加入到MAIN_HDR。...}/src/*.h) 1.13.2 递归搜索该文件夹,文件夹下(包含子目录)符合类型文件添加到文件列表 例如当前文件夹下(包括子目录下)所有.cpp文件文件名加入到MAIN_SRC,所有.h加入到...}/src/*.cpp) file(GLOB_RECURSE MAIN_HDR_ELSE ${CMAKE_CURRENT_SOURCE_DIR}/src/*.h) # MAIN_SRC_ELSE添加到...MAIN_SRC # MAIN_HDR_ELSE添加到MAIN_HDR list(APPEND MAIN_SRC ${MAIN_SRC_ELSE}) list(APPEND MAIN_HDR

1.5K10

CMake学习笔记(二)——CMake语法

内部构建方法cmake生成中间文件和可执行文件都会存放在项目目录;外部构建方法,中间文件与可执行文件都存放在build目录。 笔者强烈建议使用外部构建方法。...ADD_EXECUTABLE 格式: ADD_EXECUTABLE(exename srcname) exename:可执行文件名 srcname:生成该可执行文件源文件 该命令给出源文件名称,并指出需要编译出可执行文件名...定义了该工程会生成一个名为CRNode可执行文件,所依赖源文件是变量SRC_LIST定义源文件列表。...SRC_LIST) 该指令当前目录下文件列表全部存入变量SRC_LIST。 14....FOREACH FOREACH有三种使用形式语法,且每个FOREACH都需要一个ENDFOREACH()与之匹配。

5.5K100
  • LanChatRoom局域网聊天室

    还创建了一个自定义工具类,实现一个静态工具方法imageToBase64。用于image对象转换为base64格式字符串,嵌入到html。...构建多个可执行文件 一个项目构建多个可执行文件,而不是为每一个可执行文件创建新项目。 这需要修改CmakeList文件,为每一个构建目标指定文件。...括号内,第一个参数LanChatRoom是构建后可执行文件名。 后面的所有参数,都是参与构建这个可执行文件源代码文件,包括头文件、源文件、资源文件。之后可能还会导入更多。...窗口程序,不显示cmd 这需要在CmakeList添加: set(CMAKE_WIN32_EXECUTABLE TRUE) 否则会携带一个控制台窗口。...使用windeployqt需要预先将所在目录添加到环境变量,以我电脑为例,windeployqt在目录C:\Tools\Qt\6.6.1\mingw_64\bin下。

    21610

    小白入门笔记:CMake编译过程详解

    }, ${ARG2}输出特定索引处实参值、${ARGN}输出最后一个预期参数之后由调用者传递匿名参数列表。...2.3.2 include() 指令 Modern CMake重要一个模块就是引用官方和CMake社区已经配置好了CMake模板,所谓CMake模板就是CMake代码划分到单独.cmake...本示例,我们展示如何源代码编译到库,以及如何链接这些库。 回看第一个例子,这里并不再为可执行文件提供单个源文件,我们现在引入一个类,用来包装要打印到屏幕上消息。...本例,警告标志有-Wall、-Wextra和-Wpedantic,这些标示添加到geometry目标的编译选项,其中compute-areas和 geometry目标都将使用-fPIC标志。...示例中将应用这样循环,在引入新目标的前提下,来为一组源文件进行优化降级: 最后,在回顾第二章循环语句使用方式,以foreach()为例,其有四种使用方式: 1. foreach(loop_var

    5.8K31

    Android NDK 开发之 CMake 必知必会

    Android Studio 从 2.2 版本起开始支持 CMake ,可以通过 CMake 和 NDK C/C++ 代码编译成底层库,然后再配合 Gradle 编译库打包到 APK 。...include_directories 头文件添加到搜索路径 set_target_properties 设置库一些属性 target_link_libraries 库与其他库相关联 如果你对上面的步骤还是不了解...clion_cmake_build CMake 编译可执行文件 一个打印 hello world cpp 文件,通过 CMake 将它编译成可执行文件。...而 add_executable 就是指定最后编译可执行文件名称和需要编译 cpp 文件,如果工程很大,有多个 cpp 文件,那么都要把它们添加进来。...这就是 CMake 一个简单操作, cpp 编译成可执行文件,但在 Android ,大多数场景都是把 cpp 编译成库文件。

    1.5K20

    CMake教程】(五)CMake 配置install打包

    (1)系列教程介绍   我们编译生成可执行文件一般,会生成在当前编译路径下,也就是build或者release路径下。那么如何编译生成可执行文件和库文件打包到一起进行发布那?...本片教程我们讲述如何在cmake配置install打包路径。下面我们将以mathlib库和头文件为例子进行配置。...(APPEND EXTRA_LIBS mathlib) # 子路径"${PROJECT_SOURCE_DIR}/mathlib"添加到外部路径变量EXTRA_INCLUDES list(APPEND...变量路径 # 配置可执行文件到安装路径 CMAKE_INSTALL_PREFIXbin install(TARGETS tutorial DESTINATION bin) # 配置程序头文件到安装路径...1) # 程序段额依赖库输出到安装路径 CMAKE_INSTALL_PREFIXlib文件夹 install(TARGETS mathlib DESTINATION lib) # 文件mathlib.h

    9K21

    CMAKE使用手记

    指定项目的名称 指定需要 CMake 最低版本 dir 目录下所有源文件名字保存在变量 指定从一组源文件编译出一个可执行文件且命名 指定从一组源文件 source1 source2 …...2、CMake 变量只有两种类型:字符串,和字符串数组。 3、变量无需声明即可赋值或者使用。未赋值变量默认为一个空字符串。 4、与其他语言编程语言不同是,CMake 脚本语法没有赋值操作。...}一个变量名包了起来,那么该变量也会被代换。...(VERSION 3.0) # 最低版本 project(main) # 给这个工程一个名字,这不是可执行文件名字,是工程名字 # 设置编译选项,不知道最后能不能过 set(CMAKE_CXX_FLAGS...${CMAKE_CXX_FLAGS} -g) # 设置可执行文件最后输出目录 set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) # 配置头文件搜索路径

    51620

    用C写一个web服务器(三) Linux下用GCC进行项目编译

    本想着接下来大概实现一下 CGI 协议,但是实现过程中被一个问题卡住了: C进程与php进程交互数据类型问题: 在 C 进程我准备服务器处理后请求数据存储在一个结构体内,然后将此结构体信息传给...例如:C数学函数库math.h动态库文件名为libm.so,那么我们编译连接文件时就需要添加-lm选项。...另外静态和动态库文件搜索目录顺序不一样,下面分别详细介绍: 静态库 静态库文件一般是以.a为后缀库文件,它在编译连接时会将库文件内容全部添加到可执行文件,在编译连接完成后,静态库文件便不再影响可执行文件...、/usr/lib、/usr/local/lib等; 动态库 动态库文件一般以.so结尾,它在编译连接时只把动态库文件添加到可执行文件,只在程序运行时才加载库文件。...CmakeList,解释放在注释

    1.5K100

    从零开始仿写一个抖音App——音视频开篇GitHub地址

    2.我们在 a 创建一个 build 目录,然后在命令行中进入这个目录最后运行 cmake .....PROJECT_BINARY_DIR}/TutorialConfig.h" ) # cmake build 目录添加到cmake 寻找 include 文件目录列表,这样一来 cmake...# 安装这个库,库和头文件分别添加到 bin 和 include 文件夹最后移动到地方如下 # /usr/local/bin/libMathFunctions_Install.a # /usr/...# 安装这个可执行文件,将可执行文件和头文件分别添加到 bin 和 include 文件夹最后移动到地方如下 # /usr/local/bin/Tutorial_Mylib_Install # /...7.最后两个方法 avformat_find_stream_info 和 av_dump_format 就比较简单了,一个是解析6信息,一个视频封装文件信息输出到文件

    2.2K10

    cmake:DEBUG_POSTFIX 根据debugrelease类型指定target输出文件名

    debug/release生成二进制文件在文件名上有区别: 比如对于target project1,在debug模式编译dll,希望在Debug模式下生成文件名为project1_d.dll,...(本文末尾有更新内容) 这就要用到CMAKE一个target属性:OUTPUT_NAME OUTPUT_NAME预定义target生成目标文件名,如果没有指定,则默认为target名字。...下面的cmake脚本以一个functin实现了对指定target,在debug模式下自动对输出文件名加_d后缀: # debug模式下对输出文件名加_d后缀 # targets 输入参数,一组target...function(set_target_output_name targets) foreach(target ${targets}) # 获取 OUTPUT_NAME_DEBUG 值 get_target_property...NOTE 实际测试证明:使用DEBUG_POSTFIX指定输出文件结尾对executable target(可执行文件)无效。

    2.8K20

    cmake使用

    image.png cmake image.png CMake一个跨平台安装编译工具,可以用简单语句来描述所有平台安装编译过程。.../.cc文件,并赋值给变量 aux_source_directory(路径 变量) # 给文件名/路径名或其他字符串起别名,用${变量}获取变量内容 set(变量 文件名/路径/...) # .cpp/.c/.cc文件生成.a静态库 # 注意,库文件名称通常为libxxx.so,在这里只要写xxx即可 add_library(库文件名称 STATIC 文件) # .cpp/....(库文件名称/可执行文件名称 链接文件名称) 步骤二 执行命令 cmake PATH 或者 ccmake PATH 生成 Makefile PATH 是 CMakeLists.txt 所在目录。...生成静态库 add_library(common SHARED util.cpp) # 生成动态库或共享库 搜索所有的 cpp 文件 aux_source_directory(dir VAR) 发现一个目录下所有的源代码文件并将列表存储在一个变量

    2K30

    关于 CMake 使用,看这一篇可能就够了

    一、Cmake 简介 cmake一个跨平台、开源构建系统。它是一个集软件构建、测试、打包于一身软件。它使用与平台和编译器独立配置文件来对软件编译过程进行控制。 二、常用命令 1....(dir VAR) 发现一个目录下所有的源代码文件并将列表存储在一个变量。...:重新定义目标二进制可执行文件存放位置 LIBRARY_OUTPUT_PATH:重新定义目标链接库文件存放位置 2....系统信息 ­CMAKE_MAJOR_VERSION:cmake 主版本号,比如 3.4.1 3 ­CMAKE_MINOR_VERSION:cmake 次版本号,比如 3.4.1 4 ­CMAKE_PATCH_VERSION...:cmake 补丁等级,比如 3.4.1 1 ­CMAKE_SYSTEM:系统名称,比如 Linux-­2.6.22 ­CMAKE_SYSTEM_NAME:不包含版本系统名,比如 Linux ­

    5.3K25

    CMake使用教程和原理

    一、什么是CMake CMake一个主要用于CPP构建工具。CMake语言是平台无关中间编译工具。同一个CMake编译规则在不同系统平台构建出不同可执行构建文件。...有些c++就是直接用语言名字命名扩展名,但有些系统可能不支持在文件名里放入加号"+",或许这里用cxxx有点像+,当时设计意图可能是这边吧。...作用是把dir1, [dir2 …]这(些)个路径添加到当前CMakeLists及其子CMakeLists头文件包含路径; AFTER 或者 BEFORE 指定了要添加路径是添加到原有包含列表之前或之后...上面的例子,hello_src是一个自定义变量,在执行了aux_source_directory(..../src ${hello_src})之后,我就可以像这样来添加一个可执行文件:add_executable(hello ${hello_src}), 意思是用hello_src里面的所有源文件来构建hello

    12.1K296

    CMake用法,这篇文章讲全了

    本文结合实例详细介绍cmake常见用法,包括单文件、多文件、多文件夹以及引用第三方库等。...单文件 假设工程只有main.cpp一个文件,文件夹布局如下: . ├── CMakeLists.txt └── main.cpp 那么该如何使用书写其CMakeLists文件呢,如下为一个简单CMakeLists.txt...# 在当前目录查找源文件,并将它们添加到SOURCES变量 aux_source_directory(....SOURCES) # 添加可执行文件,并将源文件添加到可执行文件 add_executable(MultiFileExample ${SOURCES}) 多文件夹 对于更复杂项目结构,如source...(${PROJECT_NAME} SHARED ${SOURCES}) # 添加可执行文件,并将源文件添加到可执行文件 # 链接第三方库 target_link_libraries(${PROJECT_NAME

    12810

    CMake---优雅构建CC++软件项目实践(1)

    首先说明是本篇文章不从cmake整个语法上去讲述,而是从一个实际项目的构建上入手,去了解如何优雅去构建一个软件项目,搭建一个C/C++软件项目基本依赖组件,最后形成一个构建C/C++软件项目的模板...这里概括性说明下常用cmake知识,总的来说cmake作用就是让我们找到依赖头文件和库文件,去编译源文件、链接目标文件(静态库也是目标文件一个集合),最后生成可执行文件或动/静态库: INCLUDE_DIRECTORIES...将给定目录添加到编译器用于搜索包含文件(如头文件)目录,相对路径被解释为相对于当前源目录。...注意目录仅是被添加到当前CMakeLists文件,作用于当前CMakeLists文件相关库、可执行文件或者子模块编译,对于两个不同CMakeLists.cmake并列作用是无效。...DESTINATION lib RUNTIME DESTINATION bin) 最后可执行文件安装,跟安装库是一样添加到ADD_EXECUTABLE命令调用后面,只是因为是可执行文件

    8.3K52

    CMake学习笔记

    注意 如前面的示例所述,我们源文件直接传递给add_library调用,这是现代CMake建议。...: 编译库时 编译链接库任何其他目标时 scope参数含义是: PRIVATE - 目录已添加到此目标的包含目录 INTERFACE - 该目录被添加到链接该库任何目标的包含目录。...链接一个库 Linking a Library 创建将使用您可执行文件时,必须告知编译器该库。可以使用target_link_libraries()函数来完成。...在链接期间hello_library链接到hello_binary可执行文件。...您应该测试分为反映被测代码结构测试套件。当一个测试套件多个测试需要共享通用对象common objects和子例程subroutines时,可以将它们放入一个 test fixture 类。

    1.3K00
    领券