使用标准 C 获取 Mac OS X 中的操作系统版本
我试图在 C 中以编程方式获取 Mac OS X 的版本。搜索一段时间后,我尝试了以下代码:
#include <CoreServices/CoreServices.h>
int GetOS()
{
SInt32 majorVersion,minorVersion,bugFixVersion;
Gestalt(gestaltSystemVersionMajor, &majorVersion);
Gestalt(gestaltSystemVersionMinor, &minorVersion);
Gestalt(gestaltSystemVersionBugFix, &bugFixVersion);
printf("Running on Mac OS X %d.%d.%d\n",majorVersion,minorVersion,bugFixVersion);
return 0;
}
XCode 返回 LD 错误:
架构 x86_64 的未定义符号:
“_Gestalt”,引用自:
_GetOS in main.o
我缺少什么?你如何做到这一点?
我还发现了这个片段
[[NSProcessInfo processInfo] operatingSystemVersionString]
,但我不知道如何用 C 语言编写它。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
您是否将适当的框架传递给 GCC 以启用 CoreServices?
Did you pass the appropriate framework to GCC in order to enable
CoreServices
?使用 @uchuugaka 在对 @McUsr 答案的评论中的提示,我编写了一个似乎有效的函数。我并不是说它比任何其他答案都好。
Using the hint from @uchuugaka in the comment on the answer by @McUsr, I wrote a function that seems to work. I'm not saying it's better than any other answer.
在可预见的将来,下面的代码应该可以用于确定 Mac OS X 的当前版本。
The code below should work in the foreseeable future for figuring out the current version of Mac Os X.
这是一个“工作量较少”的项目,对于家庭项目来说已经足够了(静态分配缓冲区,忽略错误)。适用于我的 OS X 10.11.1。
Here is one with "less work", good enough for home projects (statically allocated buffers, ignoring errors). Works for me in OS X 10.11.1.
如果出于某种原因您想避免使用 Gestalt API(它仍然可以正常工作,但已弃用),macosx_deployment_target.c 包含使用
CTL_KERN
+KERN_OSRELEASE
sysctl()< 的代码片段/code>,与此处的其他答案类似。
这是一个根据该代码改编的小程序,并考虑了 macOS 11 及更高版本(已在 macOS 12.6 上进行测试和验证,在更新本文时为最新的稳定版本):
If for whatever reason you want to avoid the
Gestalt
API (which still works fine, but is deprecated), the macosx_deployment_target.c in cctools contains a code snippet that uses theCTL_KERN
+KERN_OSRELEASE
sysctl()
, similar to other answers here.Here's a small program adapted from that code and taking macOS 11 and newer (tested and verified with up to macOS 12.6, which was at time of updating this post the latest stable release) into account: