解决“No usable version of libssl was found“
最近调试一个项目,其他都好好地,就是这个项目出现各种诡异的问题,也没有stack_trace,卡了好久,今天发现最后一行小字No usable version of libssl was found ,终于按图索骥解决了。
这是一个.net 5.0的项目,开始我挺担心它在ARM下不兼容的问题,但是可以顺利在Rider中成功build并运行,不得不说苹果的兼容生态和Rider的适配做的太好了,也正是因为这种错觉才让我大意了吧,所以如果您使用的是.net6那么可以忽略,6以下请耐心看完。项目运行后点击登录程序就退出了,期间没有任何debug信息,只有一行灰色小字:
第一次看到这行小字特地用brew 确认了下openssl是否已经安装,所以放过了它,这里要强调.net1到5都是不支持arm的,之所以能顺利build完全是苹果已经用Rosetta偷偷在背后运行了。
Rosetta
这是苹果用来兼容x86的转义器,有了它mac就可以跑x86程序了,惊讶的是几十M的小东西可以如此稳定高效。正因为有了它,普通用户完全不需要关心程序是x86还是arm的只接可以运行。当然作为开发需要知道背后的原理,苹果在x86和arch背后独立设置了一套生态,用于分别运行相应的程序,所以上面的问题就变成了缺少x86版本的libssl。
X86 HomeBrew
要装x86的libssl就要先装x86的HomeBrew,如果你跟我一样是从原来intel的mbp迁移过来的那它已经安装好了,如果不是就需要手动安装,下面是手动安装的步骤:
$ arch -x86_64 zsh
$ cd /usr/local && mkdir homebrew
$ curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C homebrew
Alias快捷别名
$
ibrew='arch -x86_64 /usr/local/bin/brew' $
izsh='arch -x86_64 zsh'$
azsh='arch -arm64e zsh'
安装Openssl
$
ibrew install openssl
记得运行前先用izsh切换到x86环境下,它才会使用Rosetta安装到x86生态中去,同理可以使用azsh切换回来。
环境设置libssl引用
DYLD_LIBRARY_PATH="/usr/local/opt/openssl@1.1/lib"
Tips
这里注意的是只要是x86苹果使用的路径跟以前一样都是在/usr/local/bin下,而arch的都是丢在/opt/homebrew/bin下。
前面环境变量最好是在项目文件中设置,这样不会全局影响到.net6的运行。
参考资料: