【问题标题】:MacPorts GCC 4.8.2 error with mmacosx-version-min and Foundation headers带有 mmacosx-version-min 和 Foundation 标头的 MacPorts GCC 4.8.2 错误
【发布时间】: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


    【解决方案1】:

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

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

    但是 gcc 不支持这个;它是a clang extension。通常 gcc 会按摩头文件以使其工作,但它只会影响系统头文件而不影响框架头文件。

    我只是想知道,当 QtC++ 时,为什么你要编译 Objective-C 代码,而且我希望它不依赖于 Objective-C 功能。

    【讨论】:

    • 我在发布后发现了这一点(请参阅更新)。我有一个针对 10.7 但需要移植到 10.6 的程序,它使用 C++11,所以我想我会尝试使用 GCC 进行编译,但听起来似乎还不可能。
    • 补充一点,该程序确实也依赖于Objective-C。
    猜你喜欢
    • 2014-10-10
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 2019-03-29
    相关资源
    最近更新 更多