我维护一个混合 C 和 C++ 命令行程序,需要在 Linux、Windows 和 OS X 上运行。我最近升级到 Yosemite,但我的 OS X 构建现在失败了。错误是:
/usr/include/dispatch/object.h:143:15: error: expected identifier or '(' before '^' token
其他人也遇到过这个错误.
失败的代码行是使用“^”的 typedef,它是提供对闭包支持的非标准扩展.
根本问题似乎是一些 Apple 标准标头开始需要 Clang 特定扩展。不幸的是,我们的程序有一组非常深的依赖项,其中一些无法在 Clang 下编译。我们一直在使用通过 MacPorts 安装的 GCC 编译器。我现在有一个解决方法:更改object.h
标头与 GCC 兼容。但是,破解下面的包含文件/usr/include
在我看来,这就像自找麻烦。
OS X/Clang 专家能否提出更可持续的方法来解决这个问题?这会限制 GCC 在 OS X 上的未来用途吗?
对于未来的访问者,以下应该可以让大多数标头与最新的 GCC 版本一起使用:
In dispatch/object.h
change
typedef void (^dispatch_block_t)(void);
to
#ifdef __clang__
typedef void (^dispatch_block_t)(void);
#else
typedef void* dispatch_block_t;
#endif
and in Availability.h
change
#elif defined(__MAC_OS_X_VERSION_MIN_REQUIRED)
to
#elif defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && defined(__clang__)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)