【问题标题】:How to cope with non-gcc compatible code in OS X Yosemite Core headers如何处理 OS X Yosemite Core 标头中的非 gcc 兼容代码
【发布时间】:2015-03-14 14:33:19
【问题描述】:

我维护一个需要在 Linux、Windows 和 OS X 上运行的混合 C 和 C++ 命令行程序。我最近升级到 Yosemite,我的 OS X 构建现在失败了。错误是:

/usr/include/dispatch/object.h:143:15: error: expected identifier or '(' before '^' token

Other folks have run into this bug

失败的代码行是一个使用'^'的typedef,它是non-standard extension providing support for closures

潜在的问题似乎是一些 Apple 标准头文件开始需要 Clang 特定的扩展。不幸的是,我们的程序有一组非常深的依赖项,其中一些在 Clang 下无法编译。我们一直在使用通过 MacPorts 安装的 GCC 编译器。我现在有一个解决方法:将 object.h 标头中的行更改为与 GCC 兼容。但是,在我看来,破解 /usr/include 下的包含文件就像是在自找麻烦。

任何 OS X/Clang 专家能否提出更可持续的方法来解决这个问题?这是否会限制 GCC 在 OS X 上的未来用途?

【问题讨论】:

  • Clang 是 Apple 为 OS X 支持的唯一编译器。GCC 已被弃用且不受支持。我不希望它继续运作。
  • 我担心@VariableLengthCoder 可能大部分是正确的。
  • 这让我很伤心。哦,好吧,我们现在仍然可以在 Snow Leopard 下构建。

标签: gcc clang osx-yosemite


【解决方案1】:

仅针对未来的访问者,以下内容应该可以让大多数标头使用最新的 GCC 版本:

dispatch/object.h

typedef void (^dispatch_block_t)(void);

#ifdef __clang__
typedef void (^dispatch_block_t)(void);
#else
typedef void* dispatch_block_t;
#endif

并在Availability.h 更改

#elif defined(__MAC_OS_X_VERSION_MIN_REQUIRED)

#elif defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && defined(__clang__)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-29
    相关资源
    最近更新 更多