M1 Mac下Xcode调用OpenCV imshow()出现非活跃应用窗口错误
M1 Mac下Xcode中OpenCV调用imshow()的窗口错误
环境信息
- M1 Mac,系统版本13.4(22F66)
- Xcode 14.3.1(14E300c)
- 自定义编译安装的OpenCV(含opencv_extra_modules)
安装与配置流程
- 通过
git clone拉取opencv及opencv_extra_modules源码 - 使用Homebrew安装cmake:
brew install cmake - 自定义路径编译安装OpenCV,指定
CMAKE_INSTALL_PREFIX为自定义目录 - Xcode项目配置:
- Header Search Path设置为自定义安装路径下的
include目录 - Library Search Path设置为自定义安装路径下的
lib目录 - Other Linker Flags采用
pkg-config --cflags --libs opencv4的输出结果
- Header Search Path设置为自定义安装路径下的
问题表现
调用imshow()时出现窗口前置警告与XPC连接无效错误,程序以退出码0结束。已尝试以下操作但未解决:
- 配置RunPath Search Paths
- 禁用Library Validation
- 在.zshrc中设置环境变量及PKG_CONFIG_PATH
测试代码
#include <iostream> #include <sstream> #include <opencv2/opencv.hpp> using namespace std; using namespace cv; int main(){ cout << "openCV Version: " << CV_VERSION << endl; Mat image = imread("img.jpg", IMREAD_COLOR); namedWindow("Original Image"); imshow("Original Image", image); return 0; }
错误日志
2023-10-29 17:39:35.782532+0900 surename[4309:273575] [Window] 警告:窗口CVWindow 0x108d1c010从非活跃应用请求前置,可能会被活跃应用的窗口遮挡
2023-10-29 17:39:35.783451+0900 surename[4309:273862] [client] XPC错误无处理程序:连接无效
Program ended with exit code: 0
解决建议
1. 补充waitKey()调用
OpenCV的imshow()必须配合waitKey()才能维持窗口显示,否则程序会直接退出。同时建议增加图片读取失败的判断:
int main(){ cout << "openCV Version: " << CV_VERSION << endl; Mat image = imread("img.jpg", IMREAD_COLOR); if (image.empty()) { cout << "无法读取图片,请检查路径是否正确" << endl; return -1; } namedWindow("Original Image"); imshow("Original Image", image); waitKey(0); // 无限等待按键输入,按下任意键后关闭窗口 destroyAllWindows(); return 0; }
2. 重新编译OpenCV并启用Cocoa后端
M1 Mac上需确保OpenCV编译时启用Cocoa GUI支持,重新执行编译步骤:
# 进入编译目录(示例路径,根据实际修改) cd ~/opencv-build cmake -DCMAKE_INSTALL_PREFIX=你的自定义安装路径 \ -DWITH_COCOA=ON \ -DWITH_OPENGL=ON \ -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules \ .. make -j8 # 8为CPU核心数,可根据实际调整 sudo make install
3. 调整Xcode运行设置
- 运行架构选择
My Mac (Rosetta),部分OpenCV版本对原生ARM架构的GUI支持存在兼容问题 - 给Xcode授予屏幕录制权限:系统设置>隐私与安全性>屏幕录制,勾选Xcode
4. 验证动态库链接
使用otool检查可执行文件的依赖库路径是否正确:
otool -L 你的Xcode项目生成的可执行文件路径
若存在路径错误,在Xcode的Runpath Search Paths中添加自定义安装路径的lib目录,例如/你的自定义路径/lib。
内容的提问来源于stack exchange,提问作者signalsigram
相关产品推荐
相关产品推荐

