Docker for Mac - mkmf.rb 找不到 Ruby 的头文件

80

我在我的Mac上更新了XCode,自此以后,当我使用docker-sync-stack start启动Docker时,我会得到以下错误信息:

mkmf.rb can't find header files for ruby at /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/include/ruby.h

我尝试使用以下命令安装Ruby:brew install rbenv ruby-build,但是这并没有起作用。
请问有人知道该如何解决吗?
谢谢!

2
我已经弄清楚了 - 在升级到Xcode 9之后,您还必须安装Xcode 9的命令行工具。 - Torben
9
升级到 Xcode 11 GM 后遇到了这个问题。有人找到解决方法吗?执行 sudo xcode-select --install 命令后,提示我已安装了命令行工具。我还尝试从开发者下载页面手动下载 Xcode 11 命令行工具,但仍然出现错误 mkmf.rb 找不到位于 /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/include/ruby.h 的 Ruby 头文件。 - jdelaune
11个回答

193

即使在macOS 10.14上安装了Xcode并安装了命令行工具并接受了许可证,对于Xcode 11来说,这种情况仍可能发生。

sudo xcode-select --install
sudo xcodebuild -license accept

问题在于Xcode 11中发布的macOS 10.15 SDK包含ruby2.6的头文件,但不包括macOS 10.14的ruby2.3。您可以通过运行以下命令来验证这是您的问题:

ruby -rrbconfig -e 'puts RbConfig::CONFIG["rubyhdrdir"]'

在 macOS 10.14 带有 Xcode 11 的情况下打印不存在的路径

/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0

然而,Xcode 11会在 /Library/Developer/CommandLineTools/SDKs/MacOS10.14.sdk 中安装一个macOS 10.14 SDK。不需要像其他答案建议的那样污染系统目录以安装旧的头文件。相反,通过选择该SDK,将找到适当的ruby2.3头文件:

sudo xcode-select --switch /Library/Developer/CommandLineTools
ruby -rrbconfig -e 'puts RbConfig::CONFIG["rubyhdrdir"]'

现在应该可以正确打印

/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0

同样,当选择了该SDK时,gem install应该能够正常工作。

要切换回使用当前的Xcode 11 SDK,请使用

sudo xcode-select --switch /Applications/Xcode.app

3
“$ xcrun --show-sdk-version”命令出现错误:“xcodebuild: error: SDK "/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/" cannot be located. xcrun: error: unable to lookup item 'SDKVersion' in SDK '/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/'”,我最终使用了@bdorfman的解决方案——“rbenv”。 - Mzq
3
非常好的解释,谢谢!同意正确答案。 - Graystripe
2
感谢您的回答,它不仅提供了执行命令的方法,还解释了原因,这是最佳答案。 - ernesto
1
接受许可协议后,我也成功安装了CocoaPods。谢谢。 - andrewlundy
1
非常好的答案,这正是我安装CocoaPods时遇到的问题。非常感谢。 - RadicalFish
显示剩余9条评论

137

其他解决方案对我都无效,这是我在Mac OS 10.14.x上运行以解决问题的方法:

sudo rm -rf /Library/Developer/CommandLineTools
xcode-select --install
sudo xcodebuild -license accept
open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg

15
谢谢,其他方法都无法在我使用的 macOS 10.14.6 上生效。 - Tony
5
在升级到Xcode 11之后,同样的方法也解决了我的问题。 - Paul Popiel
1
在 Xcode 11 和 Mojave 上安装 gem 包失败了。这个答案帮助了我。应该选择为答案。 - Bhaskar
3
我的问题涉及安装CocoaPods,这个解决方法对我有用。macOS 10.14.5、Xcode 11.3.1。谢谢! - Chuck Taylor
1
谢谢!这在我的MacOS 10.14.6和Xcode 11.1上有效。 - Romeo Profijt
显示剩余5条评论

36

升级XCode时,您需要安装命令行工具,并额外接受条款和条件:

sudo xcode-select --install

那么:

sudo xcodebuild -license

6
第一条命令足以停止docker-sync-stack的抱怨。实际上,第二条命令失败了,显示“xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer directory '/Library/Developer/CommandLineTools' is a command line tools instance”。 - Motin
1
正如@Motin所说,似乎第二个命令不起作用,但幸运的是,它并不需要使docker-sync start停止抱怨。 - Joseph Siefers
这对我来说不够,不幸的是。 - ryanpcmcquen

20

从Xcode 11开始,似乎不再包含Ruby开发头文件,因此您需要在Xcode命令行工具之外手动安装它们。

例如,对于我使用的rbenv,我执行了以下操作:

rbenv install 2.6.4
rbenv global 2.6.4
eval "$(rbenv init -)"

然后运行bundle install,一切都按预期工作。


1
最重要的是,这对我起作用了。我还想指出,在我的CI工作流中添加rbenv,我能够取得很大的改进(不再需要使用sudo安装bundler!)非常感谢@bdorfman。 - Tumata
1
由于某些原因,这对我不起作用。 我甚至尝试将“2.6.4”替换为“2.3.0”。 当我查看时,虽然路径到“include”存在,但没有“/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/include”目录。 - Darrell Brogdon
谢谢,但是我不得不再次安装gem,因为对于docker-sync没有要绑定的内容。@fnordl的答案对我有用。 - nils petersohn
@DarrellBrogdon,你的环境可能没有正确设置。如果它正常工作,mkmf 将不再寻找 2.3 版本,而是寻找你设置的任何版本。如果你仍然在使用路径 /System/Library/Frameworks/Ruby.framework/Versions/2.3 时出现错误,这表明你的环境仍在使用 macOS 系统 Ruby 而不是 rbenv 的 Ruby。 - bdorfman
这也解决了我的 Docker x Ruby 问题。 - Julius Naeumann

16

对于Xcode 11,我通过安装/Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg软件包来解决了这个问题。


1
嘿,我没有这个文件。我在哪里可以找到它? - nils petersohn
验证Sergey提供的路径中是否存在该pkg。从根目录检查路径,不在用户路径中。如果不存在,则可以尝试首先安装命令行工具:xcode-select --install,然后它应该出现。然后,一旦您在该路径下拥有了该软件包,请强制安装,如下所示:sudo installer -pkg macOS_SDK_headers_for_macOS_10.14.pkg -target /(从/Library/Developer/CommandLineTools/Packages执行)。 - daveferrara1

16

单行命令修复:

在OSX Mojave上,我运行了以下命令:

sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /

并且它修复了这个问题。


1
这对我解决了问题。 - Ruben Marin
2
对我没有用。我被提示添加-allowUntrusted标志。但最终仍然失败了。错误消息是installer: The install failed (The Installer encountered an error that caused the installation to fail. Contact the software manufacturer for assistance.) - Anthony Kong
1
尝试了所有的方法后,你救了我的命,谢谢。 - Mohammed Riyadh

7

我在安装fastlane时遇到了相同的问题。tadman的回答是正确的,但是命令行在我的Xcode 10.2.1中无法工作(我不确定其他版本)。您需要打开Xcode,然后打开“偏好设置”,选择“位置”,并选择“命令行工具”。在我的情况下,“命令行工具”字段为空。


1
在搜索了几个小时后,这对我有用。谢谢! - RoyB
非常感谢,这对我也起作用了。我的Xcode版本也是10.2.1。 - mendez7

7

正如@bdorfman在他的评论中所说,自Xcode 11构建以来,Ruby头文件不再包含在内,但他们似乎正在尝试尽快为此创建一个新的构建(?):https://discuss.circleci.com/t/xcode-11-gm-seed-2-released/32505/12

对我有效的是像@bdorfman所说的使用rbenv

rbenv install 2.6.4
rbenv global 2.6.4
eval "$(rbenv init -)"

但是在添加docker-sync到您的新ruby版本之后,需要额外的步骤。因为在更改ruby版本之后(例如)

$ ruby -v
ruby 2.6.4p104 (2019-08-28 revision 67798) [x86_64-darwin18]

然后运行 gem list:

$ gem list
bigdecimal (default: 1.4.1)
bundler (default: 1.17.2)
cmath (default: 1.0.0)
csv (default: 3.0.9)
date (default: 2.0.0)
dbm (default: 1.0.0)
did_you_mean (1.3.0)
e2mmap (default: 0.1.0)
etc (default: 1.0.1)
fcntl (default: 1.0.0)
fiddle (default: 1.0.0)
fileutils (default: 1.1.0)
forwardable (default: 1.2.0)
io-console (default: 0.4.7)
ipaddr (default: 1.2.2)
irb (default: 1.0.0)
json (default: 2.1.0)
logger (default: 1.3.0)
matrix (default: 0.1.0)
minitest (5.11.3)
mutex_m (default: 0.1.0)
net-telnet (0.2.0)
openssl (default: 2.1.2)
ostruct (default: 0.1.0)
power_assert (1.1.3)
prime (default: 0.1.0)
psych (default: 3.1.0)
rake (12.3.2)
rdoc (default: 6.1.2)
rexml (default: 3.1.9)
rss (default: 0.2.7)
scanf (default: 1.0.0)
sdbm (default: 1.0.0)
shell (default: 0.7)
stringio (default: 0.0.2)
strscan (default: 1.0.0)
sync (default: 0.5.0)
test-unit (3.2.9)
thwait (default: 0.1.0)
tracer (default: 0.1.0)
webrick (default: 1.4.2)
xmlrpc (0.3.0)
zlib (default: 1.0.0)

(不包含docker-sync)

如果您运行gem安装docker-sync,您将使用docker-sync来管理rbenv的ruby。

$ gem install docker-sync


3
如果你想更深入了解这个问题:
Mac OS X 10.14 已经停止将 include 库放在它们通常的位置 /usr/include,而是只保留在 XCode 目录中。
要确认这是否是问题,只需运行 "ls /usr/include" 命令。如果结果为空,那么就是这个问题。
苹果公司提供了一个“旧版安装程序”让你能够将头文件安装到“旧位置”。
要解决这个问题,只需运行以下命令: sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /
链接:https://silvae86.github.io/sysadmin/mac/osx/mojave/beta/libxml2/2018/07/05/fixing-missing-headers-for-homebrew-in-mac-osx-mojave/

2
在终端中运行open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg会打开软件包安装向导。 正确安装后,我才能继续进行。
MacOS 10.4.4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接