吐槽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_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日
许可协议