Mac Monterey下用CMake编译OpenCV3.2.0失败及版本兼容问题求助
1. 修改ARCController兼容新版OpenCV(以4.6.0为例)
核心问题分析
程序运行时报错no opencv_java320 in java.library.path,说明代码中硬编码了旧版本OpenCV的库名,而非使用OpenCV提供的动态库名常量,同时可能存在API兼容性问题。
修复步骤
替换硬编码的库加载逻辑:
全局搜索ARCController代码中的System.loadLibrary("opencv_java320"),替换为:import org.opencv.core.Core; // ... System.loadLibrary(Core.NATIVE_LIBRARY_NAME);这会自动适配当前OpenCV版本的动态库名(如4.6.0对应
opencv_java460)。适配OpenCV API变化:
OpenCV 3.x到4.x有部分API变更,需逐一修正编译错误:- 图像读写:将
org.opencv.highgui.HighGui.imread()/imwrite()替换为org.opencv.imgcodecs.Imgcodecs.imread()/imwrite(); - 轮廓检测:
Imgproc.findContours()在4.x中调整了参数结构,需将原写法改为:List<MatOfPoint> contours = new ArrayList<>(); Mat hierarchy = new Mat(); Imgproc.findContours(src, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE); - 其他废弃API:根据Eclipse的编译提示,替换所有标记为
Deprecated的方法为官方推荐的替代方案。
- 图像读写:将
更新Eclipse库配置:
确保项目引用的是opencv-460.jar,本地库路径设置为/usr/local/Cellar/opencv/4.6.0/share/java/opencv4(该目录下包含libopencv_java460.dylib)。
2. 在Mac Monterey 12.4 (arm64) 编译OpenCV 3.2.0
核心问题分析
编译报错Flow control statements are not properly nested,是因为OpenCV 3.2.0的CMake配置与新版CMake(3.10+)不兼容,同时Java路径参数配置错误。
修复步骤
降级CMake版本:
OpenCV 3.2.0兼容CMake 3.5~3.10,通过Homebrew安装旧版本:brew install cmake@3.10 brew link --force cmake@3.10验证版本:
cmake --version,确认输出为3.10.x。修正编译命令与路径:
- 修正build目录创建命令(原命令缺少分隔符):
cd opencv-3.2.0 && mkdir build && cd build - 调整CMake参数(移除错误的Java路径配置,让CMake自动检测JDK):
cmake -DCMAKE_SYSTEM_PROCESSOR=arm64 \ -DCMAKE_OSX_ARCHITECTURES=arm64 \ -DWITH_OPENJPEG=OFF \ -DWITH_IPP=OFF \ -DCMAKE_BUILD_TYPE=RELEASE \ -DCMAKE_INSTALL_PREFIX=/usr/local/opencv-3.2.0 \ -DBUILD_opencv_python2=OFF \ -DBUILD_opencv_java=ON \ -DINSTALL_PYTHON_EXAMPLES=OFF \ -DINSTALL_C_EXAMPLES=OFF \ -DOPENCV_ENABLE_NONFREE=OFF \ -DBUILD_EXAMPLES=ON ..
- 修正build目录创建命令(原命令缺少分隔符):
修复CMake配置文件错误:
打开opencv-3.2.0/cmake/OpenCVCompilerOptions.cmake,定位到第21行附近的else语句,修正条件嵌套问题:
将原代码中多余的else(MSVC)改为else(),确保if/else/endif结构完全匹配。编译安装:
make -j4 # -j后接CPU核心数,加速编译 sudo make install配置Eclipse:
安装完成后,导入/usr/local/opencv-3.2.0/share/OpenCV/java/opencv-320.jar,本地库路径设置为/usr/local/opencv-3.2.0/share/OpenCV/java。
内容的提问来源于stack exchange,提问作者Dena

