【问题标题】:Using GraphicsMagick C API, Unknown Type Image Compile Error使用 GraphicsMagick C API,未知类型图像编译错误
【发布时间】:2013-09-26 18:58:37
【问题描述】:

我正在尝试使用 GraphicsMagick,但遇到了奇怪的构建错误,因此我将 #include <magick/magick.h> 添加到

#include <stdio.h>
int main(int argc, char *argv[]){
    printf("hello magick");
    return 0;
}

只是为了看看 WTF 正在进行。显然 hello_world 编译得很好。简单地添加 magick 标头会导致使用以下任何一种编译错误:

  • clang 或 gcc -o test.o $(pkg-config --cflags --libs GraphicsMagick) test.c
  • clang 或 gcc -o test.o $(GraphicsMagick-config --cflags --libs) test.c

来自铿锵声:

zsh/2 1791 % clang -o test.o $(pkg-config --cflags --libs GraphicsMagick) test.c
In file included from test.c:2:
/usr/include/GraphicsMagick/magick/magick.h:19:9: error: unknown type name 'Image'
typedef Image
        ^
/usr/include/GraphicsMagick/magick/magick.h:20:28: error: unknown type name 'ImageInfo'
  *(*DecoderHandler)(const ImageInfo *,ExceptionInfo *);

Hale 先生 (#1) 建议的解决方案非常适合测试。在实际项目中尝试; gcc 吐出数千行错误,例如:

/usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.1/include/f16cintrin.h: In function ‘__m128i mm256_cvtps_ph(__m256, int)’: /usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.1/include/f16cintrin.h:73:66: error: cannot convert ‘__m256 {aka float}’ to ‘__vector(8) float’ for argument ‘1’ to ‘__vector(8) short int __builtin_ia32_vcvtps2ph256(__vector(8) float, int)’ return (__m128i) __builtin_ia32_vcvtps2ph256 ((__v8sf) __A, __I);

由于成功构建项目的唯一变化是取消注释以下一项或两项:

#include <magick/api.h>
#include <magick/magick.h>

我很确定我的构建设置有问题。我没有成功找到有关 GraphicsMagick 对编译器/链接器选项的特定限制的文档。找到它可能会很好地解决问题。

【问题讨论】:

    标签: c gcc compiler-errors clang graphicsmagick


    【解决方案1】:

    使用&lt;magick/api.h&gt; 标头;这可以确保类型和前向声明以正确的顺序出现。

    【讨论】:

    • 完美适用于这两种测试。真正的项目吐出数千行错误,例如:“/usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.1/include/f16cintrin.h: In function '__m128i _mm256_cvtps_ph(__m256, int)': / usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.1/include/f16cintrin.h:73:66: 错误:无法将 '__m256 {aka float}' 转换为 '__vector(8) float' 的参数' 1' to '__vector(8) short int __builtin_ia32_vcvtps2ph256(__vector(8) float, int)' return (__m128i) __builtin_ia32_vcvtps2ph256 ((__v8sf) __A, __I); "
    • 对将 GraphicsMagick 与现有项目和依赖项集成有什么帮助吗?
    【解决方案2】:

    在项目范围的 CXXFLAGS 中从使用 std=c++0x 更改为 std=gnu++11 似乎已经解决了这个问题。无论出于何种原因,graphicsmagick 1.3.18-3 似乎可通过 std=c++0x 的 c/c++ API 使用。我知道这不是一个完整的解释或答案,但它可以让事情变得更好。

    【讨论】:

      【解决方案3】:

      此问题已在 GraphicsMagick 1.3.20 中修复。

      我找到了这个in the ChangeLog

      2014-06-15 鲍勃·弗里森哈恩

      wand/magick_compat.h:使用来自 magick/common.h 的 MAGICK_ATTRIBUTE 定义。 magick/common.h (MAGICK_ATTRIBUTE):不要取消定义 __attribute__ 因为这可能会被系统或编译器头文件使用。改为定义私有宏。解决了 SourceForge 错误 #270“使用 g++ -std=c++11 编译错误”。

      RHEL/Fedora/CentOS 用户,请查看 RedHat Bugzilla 中 EPEL7 的 GraphicsMagick 更新请求,Bug ID 1131926

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-17
        • 1970-01-01
        • 2017-04-04
        • 1970-01-01
        • 1970-01-01
        • 2018-06-10
        • 2016-01-17
        • 2012-10-17
        相关资源
        最近更新 更多