Cyrus Blog

FLAG{S0_H4PPY_C_U_H3R3} (>.<)

MacOS Mojave 10.14 下使用 brew 安装的 gcc 5 (5.5.0_2) 报错 wchar.h No such file or directory 的解决方案

本文共 580 字,预计阅读时间 3 分钟。

报错内容

1
2
3
4
5
6
7
8
$ gcc-5 -o a shit.cpp
In file included from /usr/local/Cellar/gcc@5/5.5.0_2/include/c++/5.5.0/bits/postypes.h:40:0,
from /usr/local/Cellar/gcc@5/5.5.0_2/include/c++/5.5.0/iosfwd:40,
from /usr/local/Cellar/gcc@5/5.5.0_2/include/c++/5.5.0/ios:38,
from /usr/local/Cellar/gcc@5/5.5.0_2/include/c++/5.5.0/ostream:38,
from /usr/local/Cellar/gcc@5/5.5.0_2/include/c++/5.5.0/iostream:39,
from shit.cpp:1:
/usr/local/Cellar/gcc@5/5.5.0_2/include/c++/5.5.0/cwchar:44:19: fatal error: wchar.h: No such file or directory

注:使用g++-5编译也会有此错误。

类似 https://teratail.com/questions/159022 的问题也可以使用这个方法修复。

测试 gcc 6 能否运行

使用brew install gcc@6安装 gcc 6 (目前版本为6.5.0)。

通过 g++-6 编译程序,可以正常编译运行。注意是 g++-6 不是 gcc-6,gcc-6 会产生如下错误:

1
2
3
4
5
6
7
8
9
10
11
12
$ gcc-6 -o a shit.cpp
Undefined symbols for architecture x86_64:
"std::ios_base::Init::Init()", referenced from:
__static_initialization_and_destruction_0(int, int) in ccvlYKRl.o
"std::ios_base::Init::~Init()", referenced from:
__static_initialization_and_destruction_0(int, int) in ccvlYKRl.o
"std::cout", referenced from:
_main in ccvlYKRl.o
"std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)", referenced from:
_main in ccvlYKRl.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status

这个错误不用理会,我们稍后使用 g++-6 替换全部的 gcc。

解决方案

由于 10.14 下的 brew 必须使用 Xcode 10.0 以上版本,而 Xcode 10.0 使用的版本为 gcc5。我们卸载全部 gcc 5 之后,用 g++-6 替换掉 cc / gcc / g++ / c++ / cc-5 / gcc-5 / g++-5 / c++-5。

运行brew uninstall --force gcc@5卸载整个 gcc5。

此时在 IDE 中编译会产生以下错误:

1
xcrun: error: unable to find utility "g++-5", not a developer tool or in PATH

terminal 中会报错:

1
gcc-5: command not found

随后我们将/usr/bin 中的执行文件替换:

1
2
3
4
5
6
7
8
9
10
cd /usr/bin
sudo rm -rf cc gcc g++ c++ cc-5 gcc-5 g++-5 c++-5
sudo ln -s `which g++-6` gcc
sudo ln -s `which g++-6` cc
sudo ln -s `which g++-6` g++
sudo ln -s `which g++-6` c++
sudo ln -s `which g++-6` cc-5
sudo ln -s `which g++-6` gcc-5
sudo ln -s `which g++-6` g++-5
sudo ln -s `which g++-6` c++-5

随后不管是 IDE 还是 terminal 都会使用我们的 g++-6 当做默认的 gcc / gcc-5 进行编译。问题解决。