macOS下SDK version引起的兼容性问题

作者: zhangzhongke 分类: macOS,开发工具 发布时间: 2017-06-06 18:19

背景介绍

       事出有因,公司开发的一款mac应用在测试时,没有任何问题完美运行。但是上线发布不久之后,即有用户反馈无法使用。后联系用户远程桌面查看发现:软件正常安装,但是没有启动日志。这就说明程序根本没有运行。
       由于这个程序是mac下的一个插件,因此肯定是系统没有加载成功。打开/var/log/system.log查看发现如下错误:
error
       错误非常直白。这里不得不感叹下macOS下报错机制的强大。直白的说明信息往往能够极大的提高Bug的调试效率。这里报错信息表明:在用户的机器上libSystem.B.dylib缺少_clock_gettime这个符号,继而导致程序无法正常加载。要说明的是,用户的系统是macOS 10.11.6;而开发机的版本是macOS 10.12.4
       经过一顿搜索之后得知,_clock_gettime函数是在10.12才引入进来的。而我在编译相关引用库(ffmpeg)的时候,使用的是10.12的系统,无意中引入了这个符号,从而导致系统不兼容。知道了原因之后,即可开始着手修复Bug了。

解决方法

       这种和程序无关的Bug修复起来自然比较轻松。本人开发机上用的是XCode8,其附带的SDK也是10.12的,所以有必要安装一个XCode7来重新编译。XCode的下载可以到Apple开发者网站下载,这个过程需要Apple ID登陆。过程就不再详述了。
       编译的时候,注意在Xcode中选择Base SDKDeployment Target。在XCode7中附带的SDK是10.11的版本,因此Xcode中选择Latest SDK也是没有问题的。编译后的程序可以运行如下命令查看引用符号表:

nm -j [executables]

       可以看到编译后的程序中不再包含_clock_gettime这个函数的符号了。由此,程序在旧系统上也能够正常运行了,问题解决!

参考链接

  • https://github.com/Homebrew/homebrew-core/issues/3727
  • https://github.com/zeromq/libzmq/issues/2175
  • https://bugs.erlang.org/browse/ERL-256
  • https://stackoverflow.com/questions/11989007/where-to-get-macos-sdk-10-6-for-xcode
  • https://github.com/Homebrew/brew/issues/972
  • https://github.com/phracker/MacOSX-SDKs/releases

发表评论

电子邮件地址不会被公开。 必填项已用*标注