macos系统上次本来想删除/usr/local/include下面pybind11文件夹,结果误删了整个include文件夹,虽然用homebrew重新安装了所有的工具但是不知道什么原因clang++和g++编译器编译过程会出现莫名的报错,有的是找不到头文件比如iostream,了解到include文件夹下存放重要的头文件。
那怎么办呢,我翻遍了整个互联网20年,估计应该也是没有人像我一样会删掉整个include文件夹吧,[擦汗]我记录一下我处理的办法。
首先利用xcode-select -r恢复到默认设置,终端运行:
xcode-select -r
删除bash_profile中所有clang++和g++的环境配置,终端输入clang++应该输出这个
Apple clang version 11.0.0 (clang-1100.0.33.17)
Target: x86_64-apple-darwin21.6.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
然后在终端查看所有头文件引用位置
cpp -v
#include "..." search starts here:
#include <...> search starts here:
/usr/local/include
/Library/Developer/CommandLineTools/usr/lib/clang/11.0.0/include
/Library/Developer/CommandLineTools/usr/include
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks (framework directory)
End of search list.
可以看到集中在这几个目录之下,但是include不是被删掉了吗,那不就乱套了,我是直接删掉了这个include文件夹
sudo rm -rf /usr/local/include
然后再输入cpp -v查看
#include "..." search starts here:
#include <...> search starts here:
/Library/Developer/CommandLineTools/usr/lib/clang/11.0.0/include
/Library/Developer/CommandLineTools/usr/include
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks (framework directory)
发现已经没有了/usr/local/include这是因为在没有这个路径的情况下,会跳过这个路径在别的路径中寻找头文件。
然后就可以顺利利用clang++和g++编译了
此外,记录一下用clang++和g++能支持c++11编译的办法,正常情况下,这种编译会报错,原因是auto关键字是c++11以上版本的新东西
test2.cpp:5:32: error: expected ';' at end of declaration
std::unordered_set<int> mySet{1, 2, 3, 4, 5};
^
;
test2.cpp:9:8: warning: 'auto' type specifier is a C++11
extension [-Wc++11-extensions]
我们可以在bash_profile中加上这么一句(如果你用的是bash_profile,zshrc就直接改成zshrc就行)或者手动加也行。
# g++就这个
echo "alias g++='g++ -std=c++11'" >> ~/.bash_profile
# clang++就这个
echo "alias clang++='g++ -std=c++11'" >> ~/.bash_profile
这个办法比较暴力,不知道后续在写代码中会遇到哪些问题,不过在你删除include之前最好还是备份一份比较保险,我是被这个问题折磨得焦头烂额了,不得已选择如此暴力的手段,哈哈