在子文件夹中包含标头

时间:2015-05-27 20:21:31

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

我在我的个人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的子目录可以提供名称空间。只需将所有目录添加到包含路径,就会将这些目录混合在一起,甚至可能导致冲突。

有解决这个问题的好方法吗?

公平:这是我支付的项目。

1 个答案:

答案 0 :(得分:1)

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

#cmakedefine HAVE_QWT_H
#cmakedefine HAVE_QWT6_H

然后,您可以检查标头是否存在,然后将该文件处理到最终的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
相关问题