检测是否包含Graphicsmagick或ImageMagick标头

时间:2017-04-26 13:34:17

标签: imagemagick c-preprocessor graphicsmagick

我正在开发一个使用 ImageMagick (使用/支持libMagickCorelibMagick++)的C / C ++库,用于读取和写入图像数据(进行处理)。

现在,我还想支持IM的 GraphicsMagick 分支(例如使用Debian的graphicsmagick-libmagick-dev-compat包)。

不幸的是,API已经足够分散,所以我不能使用它作为另一个的替代品。由于它们仍然非常相似,我计划使用一些#ifdef s作为API特定部分。

现在我的问题是,在包含通用标头(两种变体的名称相同)之后,通过预处理器指令检测实际使用的API似乎相当复杂。

基本上,我正在寻找类似于#define(由IM / GM标头提供)的东西,可以用来分辨两个API。类似的东西:

#include <Magick++.h>
#ifdef GRAPHICSMAGIC_DEFINE
// GM-specific code
#else
// IM-specific code
#endif

或者,对于C-API:

#include <magick/MagickCore.h>
#ifdef GRAPHICSMAGIC_DEFINE2
/* GM-specific code */
#else
/* IM-specific code */
#endif

想法?

1 个答案:

答案 0 :(得分:1)

AutoconfCMake

真的 - 没有更简单的方法,但是你需要用一些能够询问系统存在库的东西来解决你的解决方案,然后使用正确的预处理器生成config.h定义

GraphicsMagick&amp; ImageMagick似乎很简单,可以做一些聪明的事情,但现在我们已经进入了IM 7的发布一年,我们现在需要检查哪个版本和版本。根据需要调整定义。例如

// IM 6
#include <magick/MagickCore.h>
// IM 7
#include <MagickCore/MagickCore.h>

我建议您查看在线提供的其他项目使用的existing m4 scripts

回到最初的问题,通用包含标题我看起来像这样......(我引用Imagick library,但可以扩展到覆盖GM)

#if defined (IM_MAGICKWAND_HEADER_STYLE_SEVEN)
#  include <MagickWand/MagickWand.h>
#elif defined (IM_MAGICKWAND_HEADER_STYLE_OLD)
#  include <wand/magick-wand.h>
#else
#  include <wand/MagickWand.h>
#endif