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

CMake多子目录Snake项目构建提示目标未被构建如何解决?

错误原因
  • 目标配置顺序错误:CMake要求先通过add_executable/add_library定义目标,才能对该目标执行target_include_directories/target_link_libraries等配置操作。你的主CMakeLists中先调用了针对Snake目标的配置指令,但是add_executable(Snake)写在所有配置之后,CMake执行到配置指令时找不到目标,直接报错。
  • 子目录CMake目标名错误:Engine目录下的CMakeLists中,你创建的库目标名为Engine,但配置头文件路径时错误使用了全局的${PROJECT_NAME}(即Snake),此时Snake目标尚未定义,且该配置本身就应该作用于Engine库本身。
  • 冗余配置:target_link_directories仅用于查找外部预编译库,通过add_subdirectory编译的本地子模块库不需要手动配置链接目录。
  • 遗漏子目录引入:你项目中的Models、Type两个子目录未在主CMake中通过add_subdirectory引入,后续如果用到对应目录的代码会继续报错。
修正后的代码

主目录CMakeLists.txt

cmake_minimum_required(VERSION 3.16.3)
project(Snake)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(SFML_STATIC_LIBRARIES FALSE)

# 先引入所有子模块
add_subdirectory(Engine)
add_subdirectory(Models)
add_subdirectory(Type)

# 先定义最终可执行目标
add_executable(${PROJECT_NAME} main.cpp)

# 查找依赖库
find_package(SFML 2.5.1 COMPONENTS graphics audio REQUIRED)

# 再配置目标的链接规则,子模块的PUBLIC头文件会自动传递给上层目标,无需额外配置头文件路径
target_link_libraries(${PROJECT_NAME} 
    PRIVATE 
        Engine
        Models
        Type
        sfml-graphics 
        sfml-audio
)

Engine目录下CMakeLists.txt

set(HEADERS
        Engine.h)
set(SOURCES
        Engine.cpp)

add_library(Engine ${HEADERS} ${SOURCES})
# 给Engine库本身配置头文件路径,PUBLIC属性会自动传递给链接Engine的上层目标
target_include_directories(Engine PUBLIC ${CMAKE_CURRENT_LIST_DIR})

Models目录下CMakeLists.txt示例(Type目录同理配置即可)

set(HEADERS
        Snake.hpp)
set(SOURCES
        Snake.cpp)

add_library(Models ${HEADERS} ${SOURCES})
target_include_directories(Models PUBLIC ${CMAKE_CURRENT_LIST_DIR})
# 如果Models需要用到Engine或者Type的头文件,直接链接即可,上层目标不用重复配置
target_link_libraries(Models PRIVATE Engine Type)

内容的提问来源于stack exchange,提问作者ansa.sequence

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 23:45:01