You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CMake中重复设置SRC_FILES变量是否为Bug?该文件是否有效?

CMake重复设置SRC_FILES变量的疑问:是否合理、是否有效?

问题代码片段

cmake_minimum_required(VERSION 3.11)
project(Project1)

set(SRC_FILES ${SRC_FILES} ./file1.cpp)
set(SRC_FILES ${SRC_FILES} ./file2.cpp) # sets the same variable

add_library(lib_name ${SRC_FILES})

我的疑问

  1. 为何要重复设置SRC_FILES变量?这是否属于Bug?
  2. 我用以下命令查看变量值:
    message(SOURCES="${SRC_FILES}")
    
    得到输出:

    SOURCES="./file1.cpp./file2.cpp
    请问这份CMake文件是否合法有效?


回答

1. 重复设置变量的目的及是否为Bug

这种写法是CMake中追加内容到变量的传统实现方式,并不是Bug。在早期CMake版本还没有list(APPEND)命令时,开发者常通过set(VAR ${VAR} 新内容)的方式,将变量原有值与新内容拼接,实现累加文件列表的效果。

不过现在更推荐使用list(APPEND)语法,它更直观、可读性更强,能避免手动拼接可能出现的失误:

list(APPEND SRC_FILES ./file1.cpp)
list(APPEND SRC_FILES ./file2.cpp)

如果文件数量不多,直接一次性设置变量会更简洁:

set(SRC_FILES ./file1.cpp ./file2.cpp)

2. 这份CMake文件是否合法有效?

这份文件是完全合法有效的,CMake可以正常解析并生成目标库lib_name。

关于你看到的输出中两个路径连在一起的情况,大概率是message命令的写法导致的显示问题。CMake中字符串列表类型的变量,元素间默认用空格分隔,正确的输出写法应该把整个消息内容放在引号内:

message("SOURCES=${SRC_FILES}")

这样就能正常显示为SOURCES="./file1.cpp ./file2.cpp"。如果确实存在路径无空格的情况,可能是之前有代码错误地将变量设置为了单个字符串,但从你给出的代码片段来看,不存在这个问题。


内容的提问来源于stack exchange,提问作者mascai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 18:53:06