在 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 构建 FLTK 多线程 (MT) 项目
用于 VS2019 的 circa-2011 代码库的 FLTK 2.0 构建和演示