CMake中模块模式查找GLEW失败阻碍配置模式找到包的规范解决方法咨询
我正在Windows 10上用CMake构建一个C++项目,这个项目依赖PCL库和我自己开发的pcview包,而这两者又都依赖GLEW。顺带提一句,我没有编译PCL的可视化模块,理论上PCL其实不需要用到GLEW。我已经把PCL、pcview、GLEW和其他所有依赖包都配置妥当,find_package用Config模式可以轻松找到它们。
依赖关系如下:
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的一个变体)时,CMake会优先采用Module模式进行查找。如果Module模式只是静默失败,作为 fallback 的Config模式本来可以顺利找到GLEW,但问题是PCL提供的FindGLEW.cmake找不到GLEW后,调用了find_package_handle_standard_args,直接终止了整个查找流程,于是就出现了上面的错误。
是不是我哪里操作不当?用最规范、最专业的方式让CMake找到这个包应该怎么做?
当然我可以删掉PCL的FindGLEW.cmake,或者手动强制使用Config模式,或者搞些其他不太优雅的临时解决方案。但我认为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} )
备注:内容来源于stack exchange,提问作者Adayah

