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_executable
或 add_library
来创建一个目标来添加文件。您从未创建名为 core 的目标,因此您试图将这些文件添加到不存在的对象中。
实施现代 CMake 可能对这里有所帮助,这是一种 CMake 的方法,它更像是一种语言而不是一种工具。这是一个很好的初学者指南,用于构建您的项目,应该可以更轻松地使用 CMake。如果您想将项目分成模块,我建议将其作为项目中自己的受限库,然后将其作为库包含到主可执行文件中。如果您只是想组织您的源代码,请尝试将 src
和 include
目录分开的方法。它使组织和排序代码变得更加容易~
以下是现代 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 和子库的数量。
我不知道如何导入我的源文件,它们位于不同的目录中。我的项目结构如下所示:
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_executable
或 add_library
来创建一个目标来添加文件。您从未创建名为 core 的目标,因此您试图将这些文件添加到不存在的对象中。
实施现代 CMake 可能对这里有所帮助,这是一种 CMake 的方法,它更像是一种语言而不是一种工具。这是一个很好的初学者指南,用于构建您的项目,应该可以更轻松地使用 CMake。如果您想将项目分成模块,我建议将其作为项目中自己的受限库,然后将其作为库包含到主可执行文件中。如果您只是想组织您的源代码,请尝试将 src
和 include
目录分开的方法。它使组织和排序代码变得更加容易~
以下是现代 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 和子库的数量。