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

