【问题标题】:freeimage 3.17 library build failing on Mac OS X: fails with C++11 narrowing error... any ideas?在 Mac OS X 上 freeimage 3.17 库构建失败:因 C++11 缩小错误而失败......有什么想法吗?
【发布时间】:2017-03-25 00:57:47
【问题描述】:

由于对 C++ 没有任何了解(我正在自学 Swift),我正在努力解决这个问题 - 但理想情况下,我希望能够在我的 FreeImage 库中公开一些功能项目。

似乎只有一个模块产生了任何错误:dcraw_common.cpp - 错误的行是来自以下条目列表中的值 0x80 或更高的行。从我所做的调查来看,这些值对于有符号字符(最大 128?)来说似乎太大了,但该列表还包含负数,因此它不能使用无符号字符。

任何帮助都将不胜感激。

以下是 make 过程生成的错误消息示例:

    Source/LibRawLite/./internal/dcraw_common.cpp:4543:19: error: constant expression evaluates to 136 which cannot be narrowed to type 'signed char'
    [-Wc++11-narrowing]
        +1,-1,+1,+1,0,0x88, +1,+0,+1,+2,0,0x08, +1,+0,+2,-1,0,0x40,
                      ^~~~

这是代码:

    void CLASS vng_interpolate()
    {
      static const signed char *cp, terms[] = {
        -2,-2,+0,-1,0,0x01, -2,-2,+0,+0,1,0x01, -2,-1,-1,+0,0,0x01,
        -2,-1,+0,-1,0,0x02, -2,-1,+0,+0,0,0x03, -2,-1,+0,+1,1,0x01,
        -2,+0,+0,-1,0,0x06, -2,+0,+0,+0,1,0x02, -2,+0,+0,+1,0,0x03,
        -2,+1,-1,+0,0,0x04, -2,+1,+0,-1,1,0x04, -2,+1,+0,+0,0,0x06,
        -2,+1,+0,+1,0,0x02, -2,+2,+0,+0,1,0x04, -2,+2,+0,+1,0,0x04,
        -1,-2,-1,+0,0,0x80, -1,-2,+0,-1,0,0x01, -1,-2,+1,-1,0,0x01,
        -1,-2,+1,+0,1,0x01, -1,-1,-1,+1,0,0x88, -1,-1,+1,-2,0,0x40,
        -1,-1,+1,-1,0,0x22, -1,-1,+1,+0,0,0x33, -1,-1,+1,+1,1,0x11,
        -1,+0,-1,+2,0,0x08, -1,+0,+0,-1,0,0x44, -1,+0,+0,+1,0,0x11,
        -1,+0,+1,-2,1,0x40, -1,+0,+1,-1,0,0x66, -1,+0,+1,+0,1,0x22,
        -1,+0,+1,+1,0,0x33, -1,+0,+1,+2,1,0x10, -1,+1,+1,-1,1,0x44,
        -1,+1,+1,+0,0,0x66, -1,+1,+1,+1,0,0x22, -1,+1,+1,+2,0,0x10,
        -1,+2,+0,+1,0,0x04, -1,+2,+1,+0,1,0x04, -1,+2,+1,+1,0,0x04,
        +0,-2,+0,+0,1,0x80, +0,-1,+0,+1,1,0x88, +0,-1,+1,-2,0,0x40,
        +0,-1,+1,+0,0,0x11, +0,-1,+2,-2,0,0x40, +0,-1,+2,-1,0,0x20,
        +0,-1,+2,+0,0,0x30, +0,-1,+2,+1,1,0x10, +0,+0,+0,+2,1,0x08,
        +0,+0,+2,-2,1,0x40, +0,+0,+2,-1,0,0x60, +0,+0,+2,+0,1,0x20,
        +0,+0,+2,+1,0,0x30, +0,+0,+2,+2,1,0x10, +0,+1,+1,+0,0,0x44,
        +0,+1,+1,+2,0,0x10, +0,+1,+2,-1,1,0x40, +0,+1,+2,+0,0,0x60,
        +0,+1,+2,+1,0,0x20, +0,+1,+2,+2,0,0x10, +1,-2,+1,+0,0,0x80,
        +1,-1,+1,+1,0,0x88, +1,+0,+1,+2,0,0x08, +1,+0,+2,-1,0,0x40,
        +1,+0,+2,+1,0,0x10
      }, chood[] = { -1,-1, -1,0, -1,+1, 0,+1, +1,+1, +1,0, +1,-1, 0,-1 };
    ...

【问题讨论】:

  • 您可以将 0x88 重写为 -120,并且对于您遇到错误的所有此类数字也是如此。

标签: c++11 osx-yosemite freeimage


【解决方案1】:

C++11 可以防止 'narrowing conversions' 这样。早期版本的 C++ 会接受它们。我认为dcraw_common.cpp 源的这个补丁应该可以修复它。

https://gist.github.com/conchurnavid/ac19c8e882f1835f0310

这里有一个重复的问题。 Building FreeImage 3.16.0 for Android

【讨论】:

  • 非常感谢。我应用了补丁,但仍然有一行错误。在 adobe_coeff 类中: - 短黑色,最大值,trans[12]; + 超短黑色,最大; + 短反[12];但在 3.17 源代码中,要替换的行为:int t_black, t_maximum, trans[12];我将其替换为 2 条替换行,但出现以下错误:error: duplicate member 'imgdata' ushort black, maximum; (表示最大值为误差源)。我也尝试了make而不替换这一行,但是出现了C++11缩小错误。请问有什么想法吗?
【解决方案2】:

我发现这个问题最有用的解决方案是以下 GitHub 帖子:https://github.com/danoli3/FreeImage。在这里,某种善良的灵魂似乎已经成功构建了 3.17.0 库并上传了它。我发现效果很好。

但请记住,它是使用硬编码路径 /opt/local/lib 构建的 - 在您实施时这可能是一个问题,因为您的应用会在那里寻找它,而不是与应用捆绑在一起。我确实发现这篇LiveCode 帖子对我在这方面的理解有很大帮助。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2022-07-07
    • 2014-02-04
    • 1970-01-01
    • 1970-01-01
    • 2013-11-28
    • 2011-12-01
    • 2011-12-07
    • 2013-01-08
    • 1970-01-01
    相关资源
    最近更新 更多