Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 为什么升级到macOS Sierra/Xcode 8后,MAC_OS_X_VERSION_MIN_是必需的,MAC_OS_X_VERSION_MAX_是不允许的?_Objective C_Macos_Cocoa - Fatal编程技术网

Objective c 为什么升级到macOS Sierra/Xcode 8后,MAC_OS_X_VERSION_MIN_是必需的,MAC_OS_X_VERSION_MAX_是不允许的?

Objective c 为什么升级到macOS Sierra/Xcode 8后,MAC_OS_X_VERSION_MIN_是必需的,MAC_OS_X_VERSION_MAX_是不允许的?,objective-c,macos,cocoa,Objective C,Macos,Cocoa,我的libui项目必须在OS X 10.8及更高版本上编译,因此 #define MAC_OS_X_VERSION_MIN_REQUIRED MAC_OS_X_VERSION_10_8 #define MAC_OS_X_VERSION_MAX_ALLOWED MAC_OS_X_VERSION_10_8 在Cocoa代码的共享头文件中。到目前为止,这是有效的;我没有看到10.9之后不推荐使用的函数。然而,在昨晚升级到10.12和Xcode 8之后,我突然看到一大堆不赞成的警告,比如 /Users

我的libui项目必须在OS X 10.8及更高版本上编译,因此

#define MAC_OS_X_VERSION_MIN_REQUIRED MAC_OS_X_VERSION_10_8
#define MAC_OS_X_VERSION_MAX_ALLOWED MAC_OS_X_VERSION_10_8
在Cocoa代码的共享头文件中。到目前为止,这是有效的;我没有看到10.9之后不推荐使用的函数。然而,在昨晚升级到10.12和Xcode 8之后,我突然看到一大堆不赞成的警告,比如

/Users/pietro/src/github.com/andlabs/libui/darwin/entry.m:181:28: warning: 
      'NSRegularControlSize' is deprecated: first deprecated in macOS 10.12
      [-Wdeprecated-declarations]
        uiDarwinSetControlFont(t, NSRegularControlSize);
                                  ^~~~~~~~~~~~~~~~~~~~
                                  NSControlSizeRegular
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSCell.h:102:28: note: 
      'NSRegularControlSize' has been explicitly marked deprecated here
static const NSControlSize NSRegularControlSize API_DEPRECATED_WITH_REPL...
                           ^
好像我提供的宏被忽略了一样。我试图弄清楚到底发生了什么,但我得到的是混合信号:苹果开发者网站上的一些消息来源告诉我,它确实需要MAC OS X X X版本的MIN,而其他人告诉我我是对的。一些来源似乎暗示这些值是由编译器设置决定的?我也不知道h还想要什么

值得一提的是,这个项目使用CMake来构建,而不是直接使用Xcode项目


那么我做错了什么?谢谢。

我总是用编译器标志设置它们:
-mmacosx version min=10.8
。CMake还有一个
CMake\u OSX\u DEPLOYMENT\u TARGET
变量,我认为它设置了这个变量

不过,我不认为它能摆脱那些反对的警告。对于那些不推荐使用的AppKit常量,不推荐使用的常量和新常量的值相同。您可以使用新常量,该值相同,并且应该与旧操作系统的二进制兼容


但是,使用新的常量将阻止代码在早于10.12的系统上编译。emacs使用代码中的新常量,但在使用10.12之前的SDK编译时,将旧常量定义为新常量。我为qemu而叹息。问题是我会变得愚蠢

好的,所有这些新的弃用系统都有文档记录,但都是以迂回的方式记录的。首先,新的弃用宏是。如果我在Availability.h中查看它们的定义,我会看到它们在clang中被扩展为一个新的
Availability
属性。你瞧

但是等等,我有

set(CMAKE_OSX_DEPLOYMENT_TARGET "10.8")
在我的CMakeLists.txt中。这还不够吗?显然不是,因为没有将
-mmacosx版本min
放入Makefiles

CMAKE\u OSX\u DEPLOYMENT\u TARGET
是那些愚蠢的CMAKE变量之一,它要求您
CACHE STRING”强制执行实际的
set()
,以使它们正常工作。所以有一次我把线路改成了

set(CMAKE_OSX_DEPLOYMENT_TARGET "10.8" CACHE STRING "" FORCE)
反对的警告消失了。为什么这么多的CMake变量坚持这样缓存?
set()
不够好吗?为什么我需要
强制
缓存;甚至
CACHE
都不够好吗试图用纯makefile来维护libui被证明太笨拙了,而且CMake是大多数人想要的选项,这真是太遗憾了/


当然,弃用警告已经消失了,但这并没有把我们引向那里,因为一些被重命名的常量被保留在
static const
变量中。这意味着我不能说

case NSKeyUp:
在一个
switch
语句中,没有关于标准遵从性的警告,因为在C99中技术上不允许这样做(
const
只是对编译器的一个提示),我显式禁用了GNU语言扩展(主要是个人偏好)。我认为C++中也不允许(实际上,我非常确信C++ 11之所以引入了<代码> CONTXPRPR <代码>,但是一旦我验证了我将在这个问题上发布一个雷达。我会在回答时更新更多细节


同时谢谢你的帮助

您是否包括Acros.h的可用性?这不是自动包含在
中吗?您的部署目标在构建设置中设置为<10.12吗?@Wevah是的,它是10.8,使用
集完成(CMAKE\u OSX\u deployment\u target“10.8”)
。哦,对了,您正在使用CMAKE构建。我把那句台词删掉了。谢谢。稍后(当我有更多时间的时候)我会仔细阅读/回复这篇文章,但我会说我已经在我的CMakeLists.txt中设置了
(CMAKE\u OSX\u DEPLOYMENT\u TARGET“10.8”)
。我还想知道
-mmacox version min
标志或者CMAKE在那里生成的任何其他标志(对不起,我现在忘记了细节)只影响对象文件和链接步骤。实际上,我刚刚注意到:一些弃用警告出现在
static const
变量上,这意味着我不能在ISO C99模式下的
switch
语句中使用它们,而不会发出警告。我很想在这一点上打开一个雷达,如果我可以从源代码中了解当前宏应该是什么,或者如果你链接的开源代码是我唯一的选择。。。(我希望我可以使用不同的SDK,但我现在似乎只有10.12.SDK。)每个警告都应该告诉您替换宏是什么,您还可以在标题中看到它们的定义。例如,在NS_枚举中定义了
NSControlSizeRegular
(新的一个),然后弃用的
NSRegularControlSize
静态常量NSControlSize NSRegularControlSize=NSControlSizeRegular不应该有相同的
静态常量问题。它不会,但会破坏旧系统上的编译,因此您链接的那些开源项目必须自己定义
s。您能提供一个例子吗?我刚刚设置了编译器标志
ADD\u COMPILE\u选项(-mmacosx version min=10.10)
set(CMAKE\u OSX\u DEPLOYMENT\u TARGET“10.10”CACHE STRING”“FORCE)
,但没有任何更改。我使用CMake 3.20.2。