MacOS clang 通过 Homebrew 在 Mojave `wchar.h` 下损坏

MacOS clang via Homebrew broken under Mojave `wchar.h`

毫无疑问,OSX Mojave 的新更新破坏了我在 Homebrew 中安装的 llvm,这些是我尝试过的步骤:

xcode-select --install # Complained, so I installed commandLineTools from here https://developer.apple.com/download/more/
xcode-select -p /Library/Developer/CommandLineTools
xcode-select --install # Now says installed
sudo xcodebuild -license # Fails, as it says I only have CommandLineTools installed in /Library/Developer/CommandLineTools not xcode

# Try something else (all versions)
brew uninstall --force llvm
brew install llvm # yay v7 how exciting

# Only it still don't work
clang++ -std=c++17 foo.cpp -o f
In file included from foo.cpp:1:
In file included from /usr/local/Cellar/llvm/7.0.0/include/c++/v1/iostream:38:
In file included from /usr/local/Cellar/llvm/7.0.0/include/c++/v1/ios:215:
In file included from /usr/local/Cellar/llvm/7.0.0/include/c++/v1/iosfwd:90:
/usr/local/Cellar/llvm/7.0.0/include/c++/v1/wchar.h:119:15: fatal error: 'wchar.h' file not found
#include_next <wchar.h>
              ^~~~~~~~~
1 error generated.

有什么想法吗?我尝试过的前半部分是在网上找到的,但主要是针对 MacOS 的旧更新,也许 Mojave 以一种新的、不可预测的方式破坏了东西。

这是最新 macos 的一个众所周知的问题。尝试设置这个环境变量,它必须解决这个问题。

export LIBCLANG_SYSTEM_INCLUDE_DIR="/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include"

我是这样解决的(很脏但是用了很久):

  1. 在我的 Mac
  2. 上禁用 SIP
  3. 符号链接 /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/usr/include 正如在 POSIX 环境中预期的那样。
  4. 重新启用 SIP。

现在我必须记下每次新 OSX 更新出来时都要重新做这件事。这没有破坏 Xcode、clang(来自 brew)等任何东西,所以我会保留它。不过请注意,这可能会破坏您的东西。

我做了一些愚蠢的事情,但确实解决了问题...但不确定它是否适用于您的计算机。

这是我所做的: 我最初在 Mojave 上的 MacBook 上使用 Homebrew 安装了 c++...所以我不得不使用 /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg 中的安装程序手动安装 Xcode CommandLineTools。然后,我将 "c++" 文件夹内容从文件夹 /Library/Developer/CommandLineTools/usr/include/c++/v1 复制到我希望丢失文件所在的文件夹,位于 /usr/local/Cellar/gcc/8.2.0/include/c++/8.2.0 ,同时替换具有相同名称的文件。

这个技巧奏效了,因为现在丢失的文件 "wchar.h" 就在它应该在的地方......事后看来,我本可以使用 simlink。干杯!