使用指定SDK时如何让Xcode的clang识别/usr/local/include路径
结论
不需要修改Homebrew的安装路径,该问题有多种更简便的解决方案。
问题根因
你指定-isysroot参数后,Xcode 版本的 Clang 会默认将所有自定义头文件搜索路径拼接到 SDK 路径下进行查找,你写的-I /usr/local/include实际会被解析为:/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.3.sdk/usr/local/include
而你通过 Homebrew 安装的 boost 头文件存放在系统真实路径/usr/local/include下,自然无法被搜索到。
可行解决方案
方案1(推荐,侵入性最小):添加
-no-sysroot-prefix编译参数
加入该参数后,Clang 不会将自定义的-I路径拼接在 SDK 前缀之后,会直接按真实绝对路径搜索头文件,修改后的编译命令如下:$ xcrun clang++ foo.cpp \ -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.3.sdk \ -no-sysroot-prefix \ -I /usr/local/include方案2(无需加额外参数):使用相对路径跳出SDK目录
把-I后的路径改成从指定SDK目录出发回退到系统根目录的相对路径,即可定位到真实的头文件目录,示例如下:$ xcrun clang++ foo.cpp \ -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.3.sdk \ -I ../../../../../../../../usr/local/include你可以根据自己的SDK实际路径调整回退的层级数量。
方案3(无需修改编译命令):软链接头文件到项目目录
在项目目录下执行软链接命令:ln -s /usr/local/include/boost ./boost
之后编译时Clang会优先搜索当前目录下的头文件,无需额外添加-I参数。
内容的提问来源于stack exchange,提问作者Jean-Michaël Celerier
相关产品推荐
相关产品推荐

