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.
相关产品推荐
相关产品推荐

