在子文件夹中包含 headers

Including headers in subfolders

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

现在我对包含有问题。我想使用 Qwt 6,它在两个发行版中都可用。但是,header 文件的位置不同。在 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 的那些子目录在那里提供名称空间。仅仅将所有目录添加到包含路径会将它们混在一起,甚至可能导致冲突。

有什么好的方法可以解决这个问题吗?

公平地说:这是我为一个项目支付的工作。

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

#cmakedefine HAVE_QWT_H
#cmakedefine HAVE_QWT6_H

然后让 CMake 检查 header 是否存在并将该文件处理成最终的 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)

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

// 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