【问题标题】:cmake, clarification on include_directoriescmake,对 include_directories 的说明
【发布时间】:2013-10-09 16:01:39
【问题描述】:

我正在尝试使用 cmake,但我对 cmake 和 c++ 都是新手。我想要一段代码在不同的其他程序中使用。文件夹结构是这样的:

/modules/foo
/modules/foo/src
/modules/foo/include/foo
/cmake
/apps/bar
/apps/bar/src
/apps/bar/include

我的问题是,在 bar main 我可以同时包含(以及编译和运行)两者

#include "foo.h"
#include "foo/foo.h"

我认为这是出现问题的征兆。 我正在寻找的是类似的东西

#include "foo.h" // only inside the foo source code

#include "foo/foo.h" // outside

如果我从 /modules/foo/CMakeLists.txt 中删除 include_directories(include/foo),我会收到一个编译错误,提示在 /modules/foo/src/foo 中找不到 'foo.h' 文件。 cpp

如果我从 FindFoo.cmake 中删除 include_directories(${CMAKE_CURRENT_LIST_DIR}/../modules/foo/include) 我会在 'foo/foo.h' file not found /apps/bar/src/main.cpp

中得到错误

我能做什么?解决此类问题的常见做法是什么?我是否必须忽略这样一个事实,即在 apps/bar/src/main.cpp 中我可以同时包含 foo.hfoo/foo.h?我是否必须只写一次include_directories 并在 foo.cpp 中也使用#include "foo/foo.h

【问题讨论】:

  • IMO 在使用 src 和 include 目录时,src 应该包含源文件 (.cpp),而 include 应该包含头文件 (.h),其中头文件通常具有子目录结构。为什么在源文件夹 (/modules/foo/src/foo.h) 中有 foo.h?分离标头和源代码的优点是能够仅发送标头(即包含目录)以用于其他项目。
  • 抱歉错误。我还没有习惯考虑这些结构,我很困惑照顾那些不同的包含、来源、cmakelists 等
  • 这实际上是关于您如何构建项目的个人偏好。如果您愿意,您的源代码和标题可以在同一个目录中,主要优点是如上所述的分离。

标签: c++ cmake


【解决方案1】:
  • 使用 foo.h 和 foo.cpp 创建一个单独的目录 foo。在 foo.cpp 中放入 #include "foo.h",可能首先包含它
  • 在那里添加一个 CMakeLists.txt 文件来创建一个 foo 库,add_library 命令。
  • 在主 CMakeLists.txt 的序言中添加 include_directories(${CMAKE_SOURCE_DIR})
  • 您可以通过指定#include "foo/foo.h" 在项目的其他任何地方包含您的foo.h。无论您在哪里执行此操作,都不要忘记使用 target_link_libraries 命令链接到 foo 库。

珍贵链接:http://www.cmake.org/cmake/help/v2.8.11/cmake.html#section_Commands

【讨论】:

  • 好吧,所以在同一个目录中.. 但是为什么很多 cpp 库都有这样的结构:mylib/include/mylibmylib/src
  • @nkint 正如有人已经说过的那样,这是一个品味问题,还有一点关于你正在做的事情的背景:如果你正在编写这个子库并且你将成为使用这个子库的人,我建议你将 header 和 sources 放在一起。如果这是您要作为二进制文件分发的库,您可能希望将带有接口的标头放入包含目录中。同样,这是一个品味问题,你会看到许多可能的动机检查这个和相关的:stackoverflow.com/questions/13967296/…
猜你喜欢
  • 2011-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-27
  • 1970-01-01
  • 2016-01-24
  • 2019-09-20
  • 1970-01-01
相关资源
最近更新 更多