CMakelist包括子文件夹



我不知道如何导入我的源文件,它们在不同的目录中。我的项目的结构是这样的:

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

我的主要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)

最后,core下面的CMakelist是这样的:

set(all_src
App.h
App.cpp
)
target_sources(core ${all_src})

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

无法指定目标"核心"它不是由这个项目构建的

我该如何修复它?我的项目越来越大,把所有的文件放在不同的目录下会很方便,而不是把它们堆在add_executable

中。谢谢!

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


实现Modern CMake可能会有所帮助,这是一种将CMake视为一种语言而不是工具的方法。这里有一个很好的初学者指南构建您的项目,将会使它更容易使用CMake。如果你想把你的项目分成模块,我建议在你的项目中把它作为自己的受限库,然后作为一个库包含在你的主可执行文件中。如果你只是想组织你的源代码,那么尝试保持单独的srcinclude目录的方法。它使组织和排序代码变得更加容易~

这里有一些关于Modern 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,并将你的源代码保存在不同的目录中,而不会爆炸CMakeLists和子库的数量

相关内容

最新更新