【问题标题】:CMakelist include subfoldersCMakelist 包含子文件夹
【发布时间】:2021-10-05 23:25:01
【问题描述】:

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

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)

最后我的核心下的 CMakelist 看起来像这样:

set(all_src
        App.h
        App.cpp
        )

target_sources(core ${all_src})

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

无法为不是由该项目构建的目标“核心”指定源

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

谢谢!

【问题讨论】:

  • 你在哪里定义核心目标?
  • @stephen-newell 核心目标?核心中的文件是我项目的一部分,它们不是库或其他任何东西,我真的需要那个定义吗?
  • 如果您不想为核心使用单独的库,您可以在 src/CMakeLists.txt 中:set(core_srcs core/App.cpp core/App.h),然后是 add_executable(edu main.cpp ${core_srcs}。这使您可以按模块组织 CMakeLists.txt 并将源代码保存在不同的目录中,而不会增加 CMakeLists 和库的数量
  • @peter 谢谢,这能帮我解决导入问题吗?因为文件夹中的文件丢失了全局导入 - 包括
  • 是的,这就像在一个 add_executable 中列出每个文件。您只是在它们的子目录中引用它们。变量只是让您按模块单独列出源。

标签: c++ makefile cmake


【解决方案1】:

这里的主要问题是您从未创建过名为 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

【讨论】:

  • 但正如我所说的核心不是 lib 并且我在核心 src 目录中没有“起点”主文件,可能你可以帮助我并展示我的列表文件的外观示例
  • 字数限制足够大,您可以输入完整的句子。
  • @sweenish 我说也许答案作者可以在我的项目中向我展示如何组织 CMakelist 文件的结构和代码的示例。
  • @goGOgo,第一个链接有关于分离源和包含目录等的解释。我可以轻松提供的唯一示例是我自己的项目之一:github.com/macr0nerd/libeztp
【解决方案2】:

如果您不想为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 和子库的数量。

【讨论】:

  • 首先我的 main.cpp 不在 src 目录中?目录中的第二件事 cpp 文件在另一个目录中看不到导入
  • 您可以使用子目录名称为您的包含“命名空间”:#include ,这对于更明确地说明您正在做什么并不是一个坏方法。或者将所有子目录添加到包含路径。
猜你喜欢
  • 2015-09-14
  • 1970-01-01
  • 1970-01-01
  • 2013-02-15
  • 2011-12-25
  • 1970-01-01
  • 2014-01-14
  • 1970-01-01
  • 2018-01-02
相关资源
最近更新 更多