我正在运行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 arg:
-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允许将属性写在各个枚举器上。这允许枚举器被弃用,变得不可用等。该属性必须出现在枚举器名称之后和任何初始化器之前
答案 0 :(得分:1)
尝试将框架标头与gcc-4.8一起使用时遇到了问题。它抱怨的是在枚举器上存在一个属性,例如
enum foo {
foo_alice = 1,
foo_bob = 2,
foo_carol __attribute__((deprecated)) = 3
};
但是gcc不支持这个;它是a clang extension。通常gcc会按下标题以使它们起作用,但它只会影响系统标题而不影响框架标题。
我只是想知道为什么在Objective-C
为Qt
时您尝试编译C++
代码,我希望,这不依赖于Objective-C
特征