如何在CMakeLists.txt中控制Clang的-isystem选项解决编译冲突?
解决CMake自动添加-isystem头文件路径的问题
以下几种方法可以在CMake中手动移除自动添加的-isystem参数:
完全清空隐式系统头目录
CMake通过CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES变量控制自动引入的隐式系统头路径,将其设为空即可阻止自动添加-isystem:set(CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES "")注意:此操作会清空所有自动添加的系统头目录,若编译时缺少必要的系统头文件,需手动用
include_directories()添加对应路径(不要加SYSTEM关键字,否则会再次生成-isystem)。精准移除特定的-isystem路径
如果只想移除冲突的brew或Mac SDK头路径,可直接修改CMAKE_CXX_FLAGS,替换掉对应的-isystem参数:string(REPLACE "-isystem /opt/homebrew/include" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") string(REPLACE "-isystem /Library/Developer/CommandLineTools/SDKs/MacOSX13.sdk/usr/include" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")这种方式不会影响其他必要的系统头目录,适合只需要解决特定冲突的场景。
修改系统头目录集合
调整CMAKE_SYSTEM_INCLUDE_PATH变量,清空它可阻止CMake将这些目录标记为系统头目录(即不会生成-isystem):set(CMAKE_SYSTEM_INCLUDE_PATH "")同样,若后续编译需要特定系统头文件,需手动添加路径。
命令行临时修改(无需改动CMakeLists.txt)
如果你编译的是第三方项目(如fbthrift),不想修改原项目的CMake配置,可在运行cmake时通过命令行参数传递设置:cmake .. -DCMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES="" -DCMAKE_SYSTEM_INCLUDE_PATH=""或者直接过滤掉冲突的
-isystem参数:cmake .. -DCMAKE_CXX_FLAGS="$(echo $CMAKE_CXX_FLAGS | sed 's/-isystem \/opt\/homebrew\/include//g' | sed 's/-isystem \/Library\/Developer\/CommandLineTools\/SDKs\/MacOSX13.sdk\/usr\/include//g')"
内容的提问来源于stack exchange,提问作者KQ7
相关产品推荐
相关产品推荐

