吐槽 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
里面是这么写的。
1 |
|
这里,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 实际上是更方便的操作。
Gitalk 加载中 ...