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})
我的疑问
- 为何要重复设置
SRC_FILES变量?这是否属于Bug? - 我用以下命令查看变量值:
得到输出: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
相关产品推荐
相关产品推荐

