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

CMake报错add_executable参数数量错误,求问题根源排查

问题根源分析

你的CMake代码触发add_executable called with incorrect number of arguments错误,主要是两个核心问题导致的:

1. file(GLOB)的文件名模式写错了

你第一行里的匹配模式是*cpp,但正确的.cpp文件匹配规则应该是*.cpp——少了这个点,CMake压根找不到任何后缀为.cpp的源文件,直接导致Common_sources变量是空的。

2. RELATIVE参数的用法逻辑搞反了

RELATIVE选项需要你指定一个基准目录(相对于当前CMakeLists.txt所在的路径),用来返回匹配文件的相对路径。你现在写的RELATIVE "Common"是把目标子目录当成了基准目录,逻辑完全错误,这会让CMake无法正确定位Mps、Mss目录下的文件,最终Mps_sources、Mss_sources也大概率是空的。

当add_executable拿到的源文件列表为空时,自然就会报“参数数量不正确”——因为它至少需要传入一个源文件参数才行。


修正后的CMake代码

假设你的项目目录结构是这样的(当前CMakeLists.txt在src目录下):

src/
├── CMakeLists.txt
├── Common/
│   └── *.cpp
├── Mps/
│   └── *.cpp
└── Mss/
    └── *.cpp

可以用两种方式修正:

方式一:直接用绝对路径(推荐,直观不容易错)

# 用CMAKE_CURRENT_SOURCE_DIR获取当前CMakeLists.txt所在的绝对路径
file(GLOB Common_sources "${CMAKE_CURRENT_SOURCE_DIR}/Common/*.cpp")
file(GLOB Mps_sources "${CMAKE_CURRENT_SOURCE_DIR}/Mps/*.cpp")
file(GLOB Mss_sources "${CMAKE_CURRENT_SOURCE_DIR}/Mss/*.cpp")

add_executable(test_mss ${Common_sources} ${Mss_sources})
add_executable(test_mps ${Common_sources} ${Mps_sources})

方式二:正确使用RELATIVE参数

如果你需要拿到相对路径,可以把基准目录设为当前源目录:

file(GLOB Common_sources RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "Common/*.cpp")
file(GLOB Mps_sources RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "Mps/*.cpp")
file(GLOB Mss_sources RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "Mss/*.cpp")

add_executable(test_mss ${Common_sources} ${Mss_sources})
add_executable(test_mps ${Common_sources} ${Mps_sources})

额外小建议

尽量别用file(GLOB)来自动收集源文件——因为CMake生成构建系统后,如果你新增了源文件,不会自动被检测到,必须重新运行CMake。更可靠的方式是手动列出所有源文件,比如:

set(Common_sources
    Common/utils.cpp
    Common/log.cpp
)

set(Mps_sources
    Mps/main.cpp
    Mps/processor.cpp
)

set(Mss_sources
    Mss/main.cpp
    Mss/service.cpp
)

这样能确保CMake始终获取到完整的源文件列表,不会出现遗漏。

内容的提问来源于stack exchange,提问作者Raphael D.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:26:34