模块模式失败导致配置模式无法找到包 - 如何修复它?

问题描述 投票:0回答:1

我正在使用 CMake 在 Windows 10 上构建一个 C++ 项目。该项目链接到 PCL 库 和我自己的包 pcview,这两个包又依赖于 GLEW。顺便说一句,PCL“实际上”不应该使用 GLEW,因为尚未构建可视化模块。我在我的计算机上设置了 PCL、pcview、GLEW 和所有其他软件包,以便 find_package 可以在配置模式下轻松找到它们。

project ---> PCL
   |          |
   |          |
   v          v
 pcview ---> GLEW

但是,在处理项目的
src/CMakeLists.txt

时:

1. find_package( PCL REQUIRED )
2. find_package( pcview REQUIRED )
3. ...

它输出一个错误:

CMake Error at D:/CMake/share/cmake-3.30/Modules/FindPackageHandleStandardArgs.cmake:233 (message): Could NOT find GLEW (missing: GLEW_INCLUDE_DIR GLEW_LIBRARY) Call Stack (most recent call first): D:/CMake/share/cmake-3.30/Modules/FindPackageHandleStandardArgs.cmake:603 (_FPHSA_FAILURE_MESSAGE) D:/packages/PCL/cmake/Modules/FindGLEW.cmake:38 (find_package_handle_standard_args) D:/CMake/share/cmake-3.30/Modules/CMakeFindDependencyMacro.cmake:75 (find_package) D:/packages/pcview/cmake/pcview-config.cmake:28 (find_dependency) src/CMakeLists.txt:2 (find_package)

我发现PCL本身有一个
FindGLEW.cmake

模块,所以当我的

pcview-config.cmake
调用
find_dependency
( GLEW )
find_package
的变体)时,搜索首先在模块模式下进行。如果该模式只是默默地失败,则后备配置模式将毫无问题地找到 GLEW。相反,PCL 提供的 
FindGLEW.cmake
无法找到它并调用
find_package_handle_standard_args
,它完全终止并出现上面所示的错误。

我做错了什么吗?让 CMake 找到包的最健康方法是什么?

当然,我可以删除 PCL 的

FindGLEW.cmake

,或者手动强制配置模式,或者做一些其他丑陋的解决方法。但我认为 PCL 的设置是健康的,这意味着问题出在我这边。

我想知道如何以最干净和专业的方式将所有东西连接在一起。

我很确定这些是无关紧要的,但无论如何都会有人问,所以这是我的 CMake 文件。

顶部

CMakeLists.txt

cmake_minimum_required( VERSION 3.12...3.30 FATAL_ERROR )

project( pcl-pcview VERSION 1.0 )

set( CMAKE_CXX_STANDARD 20 )
set( CMAKE_CXX_STANDARD_REQUIRED True )

add_subdirectory( src )

src/CMakeLists.txt

find_package( PCL REQUIRED )
find_package( pcview REQUIRED )

set( LIBS ${PCL_LIBRARIES} pcview::pcview )


add_executable( pcl-pcview main.cxx )

target_link_libraries( pcl-pcview PRIVATE ${LIBS} )

	
c++ windows cmake point-cloud-library glew
1个回答
3
投票
message(CMAKE_MODULE_PATH="${CMAKE_MODULE_PATH}")

调用之前和之后添加

find_package(PCL REQUIRED)
来查看 PCL 是否更改了此变量;因此使用 PCL 的 FindGLEW.cmake。一种选择是在找到 PCL 后将 CMAKE_MODULE_PATH 重置为原始值:
set(original_cmake_module_path "${CMAKE_MODULE_PATH}")
find_package( PCL REQUIRED )
set(CMAKE_MODULE_PATH "${original_cmake_module_path}")
find_package( pcview REQUIRED )

或者将 find_package 调用切换为 PCL 和 pcview。

PCL 的 FindGLEW.cmake 实际上已在 2 个月前删除,因此未来的 PCL 版本将不再有该内容。该版本似乎与 CMake 3.13 中的版本相同。较新 CMake 版本中的 FindGLEW.cmake 看起来完全不同。所以看来 PCL 的 FindGLEW.cmake 已经过时了。

© www.soinside.com 2019 - 2024. All rights reserved.