and*_*abs 5 macos cocoa objective-c
我的 libui 项目必须在 OS X 10.8 及更高版本上编译并以 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
Run Code Online (Sandbox Code Playgroud)
在 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...
^
Run Code Online (Sandbox Code Playgroud)
好像我提供的宏被忽略了。我试图弄清楚发生了什么事,但我只是得到了混合信号:苹果开发者网站上的一些消息来源告诉我这确实是 __MAC_OS_X_VERSION_MIN_REQUIRED (并使用数字而不是版本本身的符号常量),而其他人则告诉我我是的。有些来源似乎暗示这些值是由编译器设置决定的?我再也无法说出 Availability.h 想要什么。
就其价值而言,该项目使用 CMake 来构建,并且不直接使用 Xcode 项目。
那么我做错了什么?谢谢。
叹。问题是 CMake 很愚蠢。
好吧,事实证明所有这些新的弃用系统都有记录,但是以一种迂回的方式记录的。首先, 10.12 SDK 发行说明中提到了新的弃用宏。如果我查看定义它们的 Availability.h,我会发现它们availability在 clang 中扩展为新属性。你瞧,他们是由-mmacosx-deployment-target毕竟是被选项控制的。
但是等等,我有
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.8")
Run Code Online (Sandbox Code Playgroud)
在我的 CMakeLists.txt 中。这还不够吗?显然不是,因为-mmacosx-version-min没有被放入 Makefile 中!
事实证明,CMAKE_OSX_DEPLOYMENT_TARGET是那些愚蠢的 CMake 变量之一,需要您CACHE STRING "" FORCE实际操作set()才能工作。所以一旦我将线路更改为
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.8" CACHE STRING "" FORCE)
Run Code Online (Sandbox Code Playgroud)
弃用警告消失了。为什么这么多 CMake 变量坚持这样缓存?还不够set()好吗?为什么我需要FORCE缓存;甚至CACHE不够好?:| 遗憾的是,试图用纯 Makefile 来维护 libui 被证明太笨重了,而 CMake 是大多数人想要的选择。:/
当然,弃用警告已经消失,但这并没有引导我们一路走来,因为一些重命名的常量被保留为static const变量。这意味着我不能说
case NSKeyUp:
Run Code Online (Sandbox Code Playgroud)
在switch没有警告有关标准合规性的声明中,因为技术上这在 C99 中是不允许的(const只是对编译器的提示),并且我明确禁用了 GNU 语言扩展(主要是个人偏好)。我认为 C++ 中也不允许这样做(事实上,我很确定 C++11 就是constexpr因为这个原因引入的),但一旦我确认我将就这个问题提交雷达报告。我将在发布时用更多详细信息更新此答案。
感谢您在此期间提供的所有帮助!
| 归档时间: |
|
| 查看次数: |
4908 次 |
| 最近记录: |