我正在使用 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} )
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 已经过时了。