吐槽 OpenCV 对 CMAKE_INSTALL_PREFIX 安装路径的设置

某种程度上,可能正是由于 OpenCV 的这种设置,导致网上很多文章对于使用 OpenCV 的项目的配置都很不优雅,写的很丑陋。

CMake 中,CMAKE_INSTALL_PREFIX的默认值,在 Windows 上是c:/Program Files/${PROJECT_NAME},在 Unix 平台上是/usr/local。在具体实践中,在 Windows 上,通常会是C:/Program Files (x86)/${PROJECT_NAME}

这些路径也是 CMake 在find_package()时会去搜索的路径。CMake 这样设置,也是便于用户在自己的项目中去使用相应的包。

大多数第三方库,在他们的CMakeLists.txt中,并不会显式地设置CMAKE_INSTALL_PREFIX的值,也就是使用 CMake 的默认值。就我使用过的那些第三方库来说,基本如此。然而,OpenCV 的 GitHub 仓库中,CMakeLists.txt里面是这么写的。

CMakeLists.txt
1
2
3
4
5
6
7
8
9
10
11
12
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)  # https://cmake.org/cmake/help/latest/variable/CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT.html
if(NOT CMAKE_CROSSCOMPILING)
if(WIN32)
set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install" CACHE PATH "Installation Directory" FORCE)
else()
set(CMAKE_INSTALL_PREFIX "/usr/local" CACHE PATH "Installation Directory" FORCE)
endif()
else()
# any cross-compiling
set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install" CACHE PATH "Installation Directory" FORCE)
endif()
endif()
CMAKE

这里,CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT的作用在文档中有说了。在新的构建目录中首次运行 CMake 且没有设置CMAKE_INSTALL_PREFIX的情况下,这个变量会被设置为TRUE。这样的效果是,在 Windows 下,OpenCV 的安装路径是在${CMAKE_BINARY_DIR}/install,也就是在构建目录下的install目录。

从表面上看,OpenCV 这样做似乎无可厚非。把安装路径设置在构建目录的子目录,便于开发者快速验证安装流程,无需管理员权限。然而,这种设置对于普通用户来说是很搞的,很不友好的。

用户在看到东西安装在这个地方,就会把主要的关注点放在,他们自己的项目要使用 OpenCV 这个库的时候,这个库是要放在什么路径比较好,然后就会在他们自己项目的CMakeLists.txt,甚至是编译命令中,非常丑陋地写进去一些东西。对于症状比较轻的患者们来说,他们可能看到在安装目录下是有OpenCVConfig.cmake这些个文件的。这样的话,只要在CMakeLists.txt中,对于CMAKE_PREFIX_PATH进行一些设置,然后接着就能使用find_package()去找这个库。而对于重症患者来说,那不得了了,要么是写那种很丑陋的include_directories()link_directories(),把头文件和库文件给硬编码到项目中,要么就是在编译命令中去显示指定头文件和库文件的路径之类的。

所以能够看到,网上那一堆关于在 C++ 使用 OpenCV 库的教程,里面各种千奇百怪的配置操作,各种复杂的写法。如果是在构建安装其他第三方库,这些多余的操作都是很不必要的。

不过,这东西在 OpenCV 的仓库已经是万年没改过了,即使这时候提 PR,那边应该也不会再去改动了。能做的比较优雅的事情,就是在最开始用 CMake 构建 OpenCV 这个库的时候,把CMAKE_INSTALL_PREFIX的值修改为C:/Program Files (x86)/OpenCV即可。当然,如果使用的是 MSVC,直接从 vcpkg 安装 OpenCV 实际上是更方便的操作。


吐槽 OpenCV 对 CMAKE_INSTALL_PREFIX 安装路径的设置
https://sunboyallen.github.io/opencv-cmake-install-prefix/
作者
sunboyallen
发布于
2024年8月20日
许可协议

Gitalk 加载中 ...