我正在开发一个使用 ImageMagick (使用/支持libMagickCore
和libMagick++
)的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
想法?
答案 0 :(得分:1)
真的 - 没有更简单的方法,但是你需要用一些能够询问系统存在库的东西来解决你的解决方案,然后使用正确的预处理器生成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