CMakelist 包含子文件夹

CMakelist include subfolders

我不知道如何导入我的源文件,它们位于不同的目录中。我的项目结构如下所示:

root
- src
   - core
      App.h
      App.cpp
      CMakelist.txt
   CMakelist.txt
main.cpp
CMakelist.txt

我在 root 下的主要 CMakelist 如下所示:

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 下的 CMakelist 如下所示:

add_subdirectory(core)

最后我的核心 CMakelist 如下所示:

set(all_src
        App.h
        App.cpp
        )

target_sources(core ${all_src})

但是它不起作用,我得到一个错误:

Cannot specify sources for target "core" which is not built by this project

我该如何解决?我的项目越来越大,将所有文件放在不同的目录中而不是将它们堆叠在 add_executable

中会很方便

谢谢!

这里的主要问题是您从未创建名为 core 的目标。您需要使用 add_executableadd_library 来创建一个目标来添加文件。您从未创建名为 core 的目标,因此您试图将这些文件添加到不存在的对象中。


实施现代 CMake 可能对这里有所帮助,这是一种 CMake 的方法,它更像是一种语言而不是一种工具。这是一个很好的初学者指南,用于构建您的项目,应该可以更轻松地使用 CMake。如果您想将项目分成模块,我建议将其作为项目中自己的受限库,然后将其作为库包含到主可执行文件中。如果您只是想组织您的源代码,请尝试将 srcinclude 目录分开的方法。它使组织和排序代码变得更加容易~

以下是现代 CMake 的一些参考资料:

https://cliutils.gitlab.io/modern-cmake/

https://hsf-training.github.io/hsf-training-cmake-webpage/aio/index.html

https://gist.github.com/mbinna/c61dbb39bca0e4fb7d1f73b0d66a4fd1

如果不想为core使用单独的库,可以在src/CMakeLists.txt中使用如下结构:

# core sources
set(core_srcs core/App.cpp core/App.h)

# aux sources
set(aux_srcs aux/stuff.cpp aux/stuff.h)

add_executable(edu main.cpp ${core_srcs} ${aux_srcs})

这让您可以按模块组织 CMakeLists.txt 并将源代码保存在不同的目录中,而不会激增 CMakeList 和子库的数量。