在 macOS 上构建 FLTK 时,“'_Nonnull' 不能应用于非指针类型”?

Posted

技术标签:

【中文标题】在 macOS 上构建 FLTK 时,“\'_Nonnull\' 不能应用于非指针类型”?【英文标题】:"'_Nonnull' cannot be applied to non-pointer type" while building FLTK on macOS?在 macOS 上构建 FLTK 时,“'_Nonnull' 不能应用于非指针类型”? 【发布时间】:2018-10-26 19:23:34 【问题描述】:

我尝试在我的 Mac 上构建 FLTK 1.3.4-2 版本。我按照说明操作,配置成功。

但是当我安装它时,它显示:

Compiling Fl_cocoa.mm...
In file included from Fl_cocoa.mm:55:
In file included from /System/Library/Frameworks/Cocoa.framework/Headers/Cocoa.h:12:
In file included from /System/Library/Frameworks/Foundation.framework/Headers/Foundation.h:128:
/System/Library/Frameworks/Foundation.framework/Headers/NSUUID.h:26:49: error: nullability specifier '_Nullable' cannot be applied to
      non-pointer type 'uuid_t' (aka 'unsigned char [16]')
- (instancetype)initWithUUIDBytes:(const uuid_t _Nullable)bytes;
                                                ^
/System/Library/Frameworks/Foundation.framework/Headers/NSUUID.h:29:30: error: nullability specifier '_Nonnull' cannot be applied to
      non-pointer type 'uuid_t' (aka 'unsigned char [16]')
- (void)getUUIDBytes:(uuid_t _Nonnull)uuid;
                             ^
2 errors generated.
make[1]: *** [Fl_cocoa.o] Error 1
make: *** [install] Error 1

有人知道如何解决这个问题吗?

【问题讨论】:

您使用的是什么编译器和版本或 Xcode?​​span> 我使用的是 gcc 4.2.1。 Xcode 已更新,即 8.1。 您本可以将其扔到搜索引擎上,并且可能会得到错误解释。无论如何,这是一个值得报告的错误。对于此处的有效问题,您应该首先从 fltk 中提取 minimal reproducible example。 【参考方案1】:

看起来你构建的系统有点混搭,通过它你发现了一个编译器错误。

错误消息表明编译器无法识别数组类型 (uuid_t) 在用作函数/方法参数类型时变为指针类型(因为 C 样式的数组通过引用而不是值传递)之前它会检查_Nullable/_Nonnull 的有效性——因此它会抛出错误,因为_Nullable/_Nonnull 不适用于数组类型。

但是,这不仅不是您的代码,而且是系统代码导致了错误,这令人惊讶。这就是mix'n'match的用武之地......

在 macOS10.13 SDK 之前,导致错误的两种方法 initWithUUIDBytes:getUUIDBytes: 没有使用可空性属性进行注释。默认情况下,Xcode 8.1 使用 macOS10.12 SDK,并且您的代码应该按照这种安排进行编译 - 包含的标头 NSUUID.h不会包含可空性属性。

如果您使用数组类型参数编写自己的代码并指定可空性,那么 Xcode 8.1 的编译器会产生错误 - 错误(至少)在该编译器中。但这不是你的代码...

Xcode 9.4.1(最新的 9)默认使用 macOS10.13SDK 并且您的代码将再次编译 - 包含的标头 包含可空性属性并且 Xcode 9.4.1 的编译器不会产生错误由于该错误已得到修复。

因此,最好的猜测是您使用的是 Xcode 8.1 但有意安装了 macOS10.13+ SDK,或者您已设法安装 macOS10.13+ SDK 标头并且您使用的是 gcc 版本,该版本具有错误,或者您安装了多个版本的 Xcode 并且命令行工具不适用于 Xcode 8.1(How to switch between multiple Command Line Tools installations in Mac OS X (without installing XCode) 可能会有所帮助),或者您的编译器和安装的 SDK 不匹配的其他情况 – 除了您之外没有其他人可以知道系统上实际安装了什么;头文件路径是系统位置,因此导致问题的头文件不是 FLTK 源文件夹中的副本。

HTH

[顺便说一句,您的 gcc 来自 2007 年,如果您正在使用它进行构建,您可能应该更新到更新的东西。]

【讨论】:

以上是关于在 macOS 上构建 FLTK 时,“'_Nonnull' 不能应用于非指针类型”?的主要内容,如果未能解决你的问题,请参考以下文章

在 Visual Studio 2010 上安装 FLTK

FLTK:窗口聚焦在 MacOS 上时的事件

使用 Visual Studio 构建 FLTK 多线程 (MT) 项目

用于 VS2019 的 circa-2011 代码库的 FLTK 2.0 构建和演示

根据构建目标,在 fltk-rs 中使用 fltk::osxMenuBar 或 MenuBar

在 Eclipse 中构建 FLTK 项目