使用mmacosx-version-min和Foundation标头的MacPorts GCC 4.8.2错误

时间:2014-03-19 22:45:31

标签: c++ gcc macports foundation

我正在运行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允许将属性写在各个枚举器上。这允许枚举器被弃用,变得不可用等。该属性必须出现在枚举器名称之后和任何初始化器之前

1 个答案:

答案 0 :(得分:1)

尝试将框架标头与gcc-4.8一起使用时遇到了问题。它抱怨的是在枚举器上存在一个属性,例如

enum foo {
   foo_alice = 1,
   foo_bob = 2,
   foo_carol __attribute__((deprecated)) = 3
};

但是gcc不支持这个;它是a clang extension。通常gcc会按下标题以使它们起作用,但它只会影响系统标题而不影响框架标题。

我只是想知道为什么在Objective-CQt时您尝试编译C++代码,我希望,这不依赖于Objective-C特征