OSX 10.13下qmake派生clang++找不到string.h的非硬编码解决方案咨询
我之前也碰到过类似的困扰,在OS X 10.13环境下,Xcode自带的clang++和系统/usr/bin/clang++的头文件搜索路径确实存在差异,这就是导致找不到string.h的核心原因。除了硬编码指定/usr/bin下的编译器,这里有几个更灵活的解决方案:
方法1:在.pro文件中补充系统头文件搜索路径
首先,先获取/usr/bin/clang++的头文件搜索路径,执行以下命令:
/usr/bin/clang++ -v -c hello.cpp
在输出里找到类似这样的部分:
#include <...> search starts here:
/usr/local/include
/usr/include
/Library/Developer/CommandLineTools/usr/include/c++/v1
...
把这些路径通过QMAKE_CXXFLAGS添加到你的.pro文件中:
QMAKE_CXXFLAGS += -I/usr/local/include -I/usr/include -I/Library/Developer/CommandLineTools/usr/include/c++/v1
这样qmake生成的Makefile就会让Xcode的clang++使用和系统编译器一致的搜索路径了。
方法2:让qmake使用Command Line Tools的clang++(动态路径)
不用硬编码/usr/bin/clang++,而是利用xcode-select工具动态获取Command Line Tools的安装路径,在.pro文件中添加:
CXX = $$system(xcode-select --print-path)/usr/bin/clang++
这样不管Command Line Tools安装在哪个路径,qmake都会自动获取到正确的clang++路径,比硬编码更适配不同环境。
方法3:指定qmake使用正确的Mac OS SDK
有时候Xcode自带的clang++需要明确指定SDK路径才能找到系统头文件,在.pro文件中添加:
QMAKE_MAC_SDK = macosx10.13
同时确保你已经安装了对应版本的Xcode SDK,或者通过xcode-select --install安装完整的Command Line Tools,这样编译器就能正确关联到系统头文件了。
方法4:检查并重置Xcode的默认Toolchain
如果以上方法都不行,可能是Xcode的默认Toolchain配置有问题。可以打开Xcode,进入Xcode > Preferences > Locations,在Command Line Tools下拉菜单中选择对应的版本,确保它指向的是你需要的工具链,之后重新运行qmake生成Makefile即可。
内容的提问来源于stack exchange,提问作者tofutim

