Homebrew默认CMAKE环境指向OpenGL Framework,如何修改?
问题背景
执行brew --env得到如下输出:
HOMEBREW_CC: clang HOMEBREW_CXX: clang++ MAKEFLAGS: -j8 CMAKE_PREFIX_PATH: /usr/local CMAKE_INCLUDE_PATH: /Library/Developer/CommandLineTools/SDKs/MacOSX11.sdk/System/Library/Frameworks/OpenGL.framework/Versions/Current/Headers CMAKE_LIBRARY_PATH: /Library/Developer/CommandLineTools/SDKs/MacOSX11.sdk/System/Library/Frameworks/OpenGL.framework/Versions/Current/Libraries PKG_CONFIG_LIBDIR: /usr/lib/pkgconfig:/usr/local/Homebrew/Library/Homebrew/os/mac/pkgconfig/11 HOMEBREW_GIT: git HOMEBREW_SDKROOT: /Library/Developer/CommandLineTools/SDKs/MacOSX11.sdk PATH: /usr/local/Homebrew/Library/Homebrew/shims/mac/super:/usr/bin:/bin:/usr/sbin:/sbin
可见CMAKE_INCLUDE_PATH仅指向OpenGL框架的头文件目录,导致通过Homebrew安装软件时找不到math.h这类系统标准头文件,安装全部失败。已尝试重装Xcode、Xcode命令行工具、彻底卸载重装Homebrew(含Cellar目录),问题仍未解决。
关于determine_cmake_include_path函数的解释
在/usr/local/Homebrew/Library/Homebrew/extend/ENV/super.rb中找到的这个函数,作用是生成Homebrew传给CMake的额外包含路径:
sig { returns(T.nilable(PATH)) } def determine_cmake_include_path PATH.new(homebrew_extra_cmake_include_paths).existing end
它基于homebrew_extra_cmake_include_paths变量创建路径集合,再通过existing方法过滤出实际存在的路径,最终赋值给CMAKE_INCLUDE_PATH。你的环境中这个变量可能只包含了OpenGL相关路径,导致系统标准头目录被排除。
解决方案
1. 临时覆盖环境变量(单次安装生效)
在执行brew install前手动指定包含系统标准头目录的CMAKE_INCLUDE_PATH:
CMAKE_INCLUDE_PATH="/usr/include:/Library/Developer/CommandLineTools/SDKs/MacOSX11.sdk/usr/include:/Library/Developer/CommandLineTools/SDKs/MacOSX11.sdk/System/Library/Frameworks/OpenGL.framework/Versions/Current/Headers" brew install [你的软件包名称]
把系统头目录放在前面,确保CMake优先搜索这些路径。
2. 永久配置Homebrew环境(全局生效)
创建或编辑~/.brewrc文件(如果不存在就新建),添加以下内容:
export CMAKE_INCLUDE_PATH="/usr/include:/Library/Developer/CommandLineTools/SDKs/MacOSX11.sdk/usr/include:/Library/Developer/CommandLineTools/SDKs/MacOSX11.sdk/System/Library/Frameworks/OpenGL.framework/Versions/Current/Headers"
保存后执行source ~/.brewrc让配置立即生效,之后所有brew install都会使用这个路径配置。
3. 修改Homebrew源码(临时方案,不推荐)
如果前两种方法无效,可以临时修改Homebrew的内部配置文件:
打开/usr/local/Homebrew/Library/Homebrew/extend/ENV/super.rb,修改determine_cmake_include_path函数,手动添加系统头目录:
sig { returns(T.nilable(PATH)) } def determine_cmake_include_path # 追加系统标准头目录到路径列表 extra_paths = homebrew_extra_cmake_include_paths + ["/usr/include", "/Library/Developer/CommandLineTools/SDKs/MacOSX11.sdk/usr/include"] PATH.new(extra_paths).existing end
注意:Homebrew更新时会覆盖这个文件,所以这只是临时修复,建议配合第二种永久配置方法使用。
内容的提问来源于stack exchange,提问作者Your Personal Friend

