如何简化OpenCV CMake项目安装路径,移除架构与编译器子路径?
移除OpenCV安装后CMake配置文件中硬编码的架构/编译器路径
背景
在Windows 10 + MSVC 16环境下,我用以下命令编译安装Debug版本的OpenCV:
cmake -Bbuild -S. -G "Visual Studio 16 2019" -DCMAKE_CONFIGURATION_TYPES="debug" cmake --build build --target ALL_BUILD --config "debug" cmake --build build --target install --config "debug"
默认安装后,OpenCV会自动生成带架构和编译器标识的子目录:
<opencv-install-dir>/x64/vc16/bin <opencv-install-dir>/x64/vc16/lib
但我的项目依赖制品要求统一的目录结构:
<artifacts-root>/<build-type>/lib <artifacts-root>/<build-type>/bin <artifacts-root>/<build-type>/include
更关键的是,OpenCV生成的OpenCVConfig.cmake、OpenCVModules.cmake等配置文件中,硬编码了x64/vc16这类路径,导致其他项目引用时找不到对应的库文件。
已尝试的方法
单独设置CMAKE_INSTALL_PREFIX无法解决问题,配置文件里的路径依然带有架构/编译器子目录。
可行解决方案
在CMake配置阶段,通过设置以下变量,强制OpenCV使用指定的平级目录结构,并让配置文件生成正确的路径:
1. 完整的CMake配置命令
cmake -Bbuild -S. -G "Visual Studio 16 2019" ^ -DCMAKE_CONFIGURATION_TYPES="debug" ^ -DCMAKE_INSTALL_PREFIX="<artifacts-root>/debug" ^ -DCMAKE_INSTALL_BINDIR="bin" ^ -DCMAKE_INSTALL_LIBDIR="lib" ^ -DCMAKE_INSTALL_INCLUDEDIR="include" ^ -DBUILD_opencv_python=OFF # 不需要Python绑定时可添加,加快编译
2. 变量说明
CMAKE_INSTALL_PREFIX:直接指定到制品的Debug版本根目录,避免后续手动移动文件CMAKE_INSTALL_BINDIR/CMAKE_INSTALL_LIBDIR/CMAKE_INSTALL_INCLUDEDIR:强制覆盖OpenCV默认的路径规则,将二进制、库、头文件直接放到bin/lib/include目录下,不再生成x64/vc16子目录BUILD_opencv_python=OFF:可选,关闭不需要的Python组件,减少编译时间和安装体积
3. 验证结果
安装完成后,检查<artifacts-root>/debug/lib/OpenCVModules-debug.cmake,里面的路径应该变为:
set_target_properties(opencv_core PROPERTIES IMPORTED_IMPLIB_DEBUG "${_IMPORT_PREFIX}/lib/opencv_core4100d.lib" IMPORTED_LOCATION_DEBUG "${_IMPORT_PREFIX}/bin/opencv_core4100d.dll" )
此时其他项目通过CMake引用该OpenCV制品时,就能正确找到对应的库文件和头文件。
4. 兼容旧版本OpenCV的额外设置
如果部分旧版本OpenCV忽略CMAKE_INSTALL_*变量,可以直接设置OpenCV自身的安装路径变量:
-DOPENCV_INSTALL_BIN_DIR="bin" ^ -DOPENCV_INSTALL_LIB_DIR="lib" ^ -DOPENCV_INSTALL_INCLUDE_DIR="include"
内容的提问来源于stack exchange,提问作者rbaleksandar
相关产品推荐
相关产品推荐

