【发布时间】:2023-03-14 16:05:01
【问题描述】:
我正在运行 10.9.2 并通过 MacPorts (sudo port install gcc48 +universal) 安装了 GCC 4.8.2,并且无法编译设置 -mmacosx-version-min=10.8 或任何其他版本并包含 Foundation 的 Objective-C 代码。如果我将版本设置为10.9 或根本不设置它,它可以工作。
代码如下:
#include <Foundation/Foundation.h>
int main() {
return 0;
}
命令如下:
g++-mp-4.8 objctest.m -mmacosx-version-min=10.8 -framework Foundation
我收到的错误是:
In file included from /usr/include/Availability.h:148:0,
from /opt/local/lib/gcc48/gcc/x86_64-apple-darwin13/4.8.2/include-fixed/math.h:46,
from /System/Library/Frameworks/CoreFoundation.framework/Headers/CoreFoundation.h:19,
from /System/Library/Frameworks/Foundation.framework/Headers/Foundation.h:6,
from objctest.m:1:
/System/Library/Frameworks/Foundation.framework/Headers/NSUserNotification.h:16:45: error: expected ',' or '}' before '__attribute__'
NSUserNotificationActivationTypeReplied NS_AVAILABLE(10_9, NA) = 3
^
即使我像这样添加 -isysroot 参数:
-isysroot `xcodebuild -version -sdk macosx Path`
它仍然不起作用(尽管它给出了与 SDK 相关的错误)。
MacPorts GCC 是否出现问题,或者这是 GCC 和 OS X 标头的问题?
我的最终目标是为 10.6 编译一个使用 C++11 特性的完整程序 (Qt gui),因此 GCC 是必须的,因为 10.6 没有 libc++。
更新 1:OS X 的标头将 __attribute__((weak_import)) 应用于单个枚举类型,而 GCC 显然不支持这一点:
对于枚举、结构或联合类型,您可以在枚举、结构或联合标记和类型名称之间指定属性,或者在定义的右花括号之后指定属性。
我不想修补 SDK 标头,所以看起来这是不行的。
更新 2:这是一个记录在案的 Clang 扩展:
Clang 允许在单个枚举器上写入属性。这允许枚举器被弃用、变得不可用等。属性必须出现在枚举器名称之后和任何初始化器之前
【问题讨论】:
标签: c++ gcc macports foundation