【问题标题】:Including headers in subfolders在子文件夹中包含标题
【发布时间】:2015-08-10 03:00:53
【问题描述】:

我在我的个人 Ubuntu 15.04 机器上开发一个 C++ 程序,最终必须在 openSUSE 13.1 上运行。为了让它在两个系统上都能正常工作,我仔细选择了要使用的库和版本。

现在我遇到了包含问题。我想使用 Qwt 6,它在两个发行版上都可用。但是,头文件的位置不同。在 Debian 上,它们位于 /usr/include/qwt/qwt_*.h,但在 openSUSE 上,它们位于 /usr/include/qwt6/qwt_*.h。我的代码目前有#include <qwt/qwt_plot.h>。这在 openSUSE 上不起作用,因为我必须在其中插入 6

我目前看到的最简单的解决方案是使用 CMake 包含任一目录,然后在源代码中编写 #include <qwt_plot.h>。但是,我认为这不是一个非常好的解决方案,因为/usr/include 的那些子目录是用来提供命名空间的。只需将所有目录添加到包含路径中,就会将它们混合在一起,甚至可能导致冲突。

有什么好办法解决这个问题吗?

公平地说:这是为了一个我有报酬从事的项目。

【问题讨论】:

  • 你可以用符号链接做一些技巧,例如。你使用哪个编译器?也许这将有助于定义编译器要使用的目录,然后从 #include
  • 或者你可以用预处理器做一些相当丑陋的事情,如那里所示:stackoverflow.com/questions/3178946/…
  • @Marged:符号链接需要对/usr/include 目录的root 访问权限,我不想强​​迫他们为此给我。我在两个发行版上都使用 g++,在 Ubuntu 上使用 4.9,在 openSUSE 上使用 4.8。与 <qwt_plot.h> 相比,这些宏看起来并没有改进。
  • 宏将允许您指定要在头文件前面使用的前缀。符号链接也可以在您运行 cmake 的目录中创建:创建一个名为“pointertoqwtinclude”的符号链接,并将其指向 /usr/include 目录。然后只需 #include "pointertoqwtinclude/stuff.h"
  • @Marged:符号链接技巧要么要求我将符号链接的目录(在 ~ 中的某处)添加到 <…> 搜索路径,要么将这些文件包含在 "…" 中。两者对我来说都像是一个黑客:-/.

标签: c++ cmake header-files include-path


【解决方案1】:

在 CMake 中,您可以像配置 autoconf 一样配置平台检查。这个想法是您包含一个始终存在但使用工具在每个平台中生成该文件的config.h 文件。您可以检查here 的方式,但作为摘要,您可以拥有一个config.h.in 文件,其中包含您要在标题中进行和使用的检查。

#cmakedefine HAVE_QWT_H
#cmakedefine HAVE_QWT6_H

然后您让 CMake 检查标头是否存在并将该文件处理为最终的 config.h 文件。在CMakeLists.txt 文件中,您可以拥有以下内容。

INCLUDE (CheckIncludeFiles)

CHECK_INCLUDE_FILES (qwt/qwt_plot.h HAVE_QWT_H)
CHECK_INCLUDE_FILES (qwt6/qwt_plot.h HAVE_QWT6_H)
CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h)

最后,在标题中包含config.h 并使用宏有条件地包含一个或另一个标题。

// always included
#include "config.h"

// conditionally include headers based one macros from config.h
#ifdef HAVE_QWT_H
#include <qwt/qwt_plot.h>
#elseif HAVA_QWT6_H
#include <qwt6/qwt_plot.h>
#else
#error QWT headers required and not present in supported locations
#endif

【讨论】:

  • 谢谢,我知道这是怎么回事了。它只会导致我的源文件中这些宏的扩散。幸运的是,这不需要扩展到第三个发行版甚至不同的平台,但我并没有真正将所有这些宏放入我的标题中:-/.
  • 是的,一团糟。尽管如此,我仍然记得 CMake 是第三代或第四代工具的一部分,它试图使这项任务变得更容易。 :)
猜你喜欢
  • 1970-01-01
  • 2015-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-28
  • 2016-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多