我将CMake 3.10.2用于C ++项目,并且在需要第三方库程序包并在不同环境中运行CMake时遇到CMake的奇怪行为:我需要一个库(在这里称为SOME_LIB
)通过
find_package(SOME_LIB REQUIRED)
尽管在两个环境中CMake调用都相同,但和搜索路径不同(CMake查找软件包的路径)。两次调用CMake时都有一些参数,一个是
-DSOME_LIB_DIR=/path/to/lib
提供软件包的安装路径。
在第一种环境中,它可以正常工作,但是在第二种系统中,找不到该库:
CMake Warning at CMakeLists.txt:123 (find_package):
By not providing "FindSOME_LIB.cmake" in CMAKE_MODULE_PATH this project has
asked CMake to find a package configuration file provided by "SOME_LIB", but
CMake did not find one.
Could not find a package configuration file provided by "SOME_LIB" with any of
the following names:
SOME_LIBConfig.cmake
SOME_LIB-config.cmake
Add the installation prefix of "SOME_LIB" to CMAKE_PREFIX_PATH or set
"SOME_LIB_DIR" to a directory containing one of the above files. If "SOME_LIB"
provides a separate development package or SDK, be sure it has been
installed.
添加选项
-DCMAKE_FIND_DEBUG_MODE=ON
CMake调用的表明,两种环境的搜索路径不同。特别是,在第二个系统上,仅仅应用以下documented个搜索模式中的第一个:
<prefix>/ (W)
<prefix>/(cmake|CMake)/ (W)
<prefix>/<name>*/ (W)
<prefix>/<name>*/(cmake|CMake)/ (W)
<prefix>/(lib/<arch>|lib|share)/cmake/<name>*/ (U)
<prefix>/(lib/<arch>|lib|share)/<name>*/ (U)
<prefix>/(lib/<arch>|lib|share)/<name>*/(cmake|CMake)/ (U)
<prefix>/<name>*/(lib/<arch>|lib|share)/cmake/<name>*/ (W/U)
<prefix>/<name>*/(lib/<arch>|lib|share)/<name>*/ (W/U)
<prefix>/<name>*/(lib/<arch>|lib|share)/<name>*/(cmake|CMake)/ (W/U)
由于搜索模式<prefix>/(lib/<arch>|lib|share)/<name>*/(cmake|CMake)/
会在我的情况下找到该软件包,因此我最初认为第二个系统未被识别为类Unix系统,但是文档还指出,“只是一个约定,因此仍在所有平台上搜索所有(W)和(U)目录。”所以我应该在CMake的调试输出中看到所有路径,不是吗?
环境是:
第一个环境(运行良好)是一个基于 Ubuntu 18.04的Docker容器,用于与GitLab CI进行持续集成;该图像配备了一些基本的开发工具和我正在使用的第三方库
第二个环境(找不到软件包;缺少搜索路径)是用于本地开发的 Ubuntu 18.04 Windows子系统(用于Linux)环境(按照docker镜像的步骤进行新设置)
两个环境都安装了相同的软件包,包括来自Ubuntu存储库(CMake 3.10.2)的cmake。我想与find_package
一起使用的库是使用CMake构建的,并且在两种环境中都以相同的方式安装。两种环境中库的目录内容是相同的。
我还尝试将第二个环境中的CMake升级到3.10.3和3.12.4(都是从源代码构建的),但是问题仍然存在。
答案 0 :(得分:0)
Tsyvarev的评论使我得到了我的问题的答案:
问题是由于我对
的误解引起的-D<PACKAGE>_DIR=/path/to/config
参数。正如Tsyvarev指出的那样,文档说 <PACKAGE>_DIR
必须指向包含配置文件的目录的确切路径 <PACKAGE>-config.cmake
。换句话说,它不是前缀路径。
它仍然在以下两种环境之一中起作用的原因仍然是一个问题:原因是我在之前从未注意到的两种环境中,库的安装路径之间存在很小但很重要的变化:
/opt/<library_name>-<version-number>/
(请注意-
这很重要!)/opt/<library_name>/<version-number>/
注意:CMake配置在
中,两个路径都包含相同的内容/opt/<library_name>-<version-number>/lib/cmake/<library_name>/<library_name>-config.cmake
分别用于第一个环境和/opt/<library_name>/<version-number>/lib/cmake/<library_name>/<library_name>-config.cmake
用于第二个环境。在第一个环境中,因为匹配模式<prefix>/<name>*/(lib/<arch>|lib|share)/cmake/<name>*/
而找到了库,其中/opt
是CMake的<prefix>
路径之一,而<name>*
被扩展为{{1 }}-在第二个环境中无法进行路径扩展。
非常感谢您的有用评论。对于缺少路径变化,我深表歉意(已经看了两天了,但没有看到问题)。