我在我的个人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
的子目录可以提供名称空间。只需将所有目录添加到包含路径,就会将这些目录混合在一起,甚至可能导致冲突。
有解决这个问题的好方法吗?
公平:这是我支付的项目。
答案 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