CMake多层子目录引入源文件时core目标不存在报错如何解决?
CMake配置错误修复方案
错误原因
报错Cannot specify sources for target "core" which is not built by this project的核心原因是:你在调用target_sources(core ${all_src})之前,没有通过add_library或者add_executable声明过名为core的构建目标,CMake无法识别core这个目标名。
额外注意:CMake要求配置文件的名称必须为CMakeLists.txt(严格区分大小写,末尾带s),如果你的子目录下配置文件拼写错误也会导致配置失效。
方案1:子模块编译为静态库(推荐,适合规模持续扩大的项目)
这种方案每个模块独立管理自身的源文件、头文件依赖、编译选项,上层目标只需要链接对应模块即可,维护成本极低。
步骤1:修改src/core/CMakeLists.txt
# 先声明core为静态库目标 add_library(core STATIC) set(all_src App.h App.cpp ) # 为已存在的core目标追加源文件 target_sources(core PRIVATE ${all_src}) # 导出当前目录为头文件搜索路径,上层目标链接core时会自动继承该路径,无需额外配置 target_include_directories(core PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
步骤2:修改根目录CMakeLists.txt
将core库链接到最终的可执行文件:
cmake_minimum_required(VERSION 3.17) project(edu) set(CMAKE_CXX_STANDARD 17) ## add subdirectory with source files add_subdirectory(src) add_executable(edu main.cpp) # 链接core模块库 target_link_libraries(edu PRIVATE core)
修改完成后即可正常编译,你在main.cpp中可以直接通过#include "App.h"引入core模块的头文件使用。后续新增其他模块时,只需要按照core的逻辑新增子目录、声明对应库目标,在根目录链接即可,无需把所有源文件都堆叠在add_executable中。
方案2:源文件变量向上传递(适合小型项目)
如果你不希望将子模块编译为独立静态库,也可以通过作用域变量把源文件列表传递到上层,统一加到可执行目标的源文件配置中。
步骤1:修改src/core/CMakeLists.txt
set(CORE_SRC ${CMAKE_CURRENT_SOURCE_DIR}/App.h ${CMAKE_CURRENT_SOURCE_DIR}/App.cpp # PARENT_SCOPE参数表示该变量可以被上级目录的CMakeLists读取 PARENT_SCOPE )
步骤2:修改src/CMakeLists.txt
add_subdirectory(core) # 继续将源文件变量向上传递到根目录 set(SRC_ALL ${CORE_SRC} PARENT_SCOPE)
步骤3:修改根目录CMakeLists.txt
cmake_minimum_required(VERSION 3.17) project(edu) set(CMAKE_CXX_STANDARD 17) ## add subdirectory with source files add_subdirectory(src) # 将子模块传递上来的源文件一起加入可执行目标 add_executable(edu main.cpp ${SRC_ALL})
内容的提问来源于stack exchange,提问作者goGOgo
相关产品推荐
相关产品推荐

