在macOS上构建FLTK时“无法将'_Nonnull'应用于非指针类型”?

时间:2018-10-26 19:23:35

标签: macos fltk

我试图在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

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

1 个答案:

答案 0 :(得分:0)

似乎您构建的系统有点“混搭”,并由此发现了编译器错误。

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

但是,这不仅是您的代码,还是导致错误的系统代码,这令人惊讶。这是混合匹配的来源...

在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年,如果您正在使用它构建,则可能应该更新到较新的版本。]