CMake 找不到 GLEW

Ric*_*ehe 4 glew cmake

我读过这篇文章 [1],但就我而言,CMake 说它找不到 glew。

我在 Windows 上,我的 CMake 模块文件夹中有一个 FindGLEW.cmake 文件,大概是在我安装 CMake-3.6 时放在那里的。我在 sourceforge 上找到了 GLEW 并下载了适用于 Windows 的 zip 文件。我解压并安装在C:\Program Files\glew。当我创建自己的库并使用 CMake 构建和安装它们时,这是它们安装的默认位置,所以我非常有信心我在这里没问题。

我的 CMakeLists.txt 中的片段是:

find_package(GLEW REQUIRED)
include_directories(${GLEW_INCLUDE_DIRS})
link_libraries(${GLEW_LIBRARIES})
Run Code Online (Sandbox Code Playgroud)

来自 CMake 的实际错误消息是:

CMake Error at C:/Program Files/CMake/share/cmake-3.6/Modules/FindPackageHandleStandardArgs.cmake:148 (message):
  Could NOT find GLEW (missing: GLEW_INCLUDE_DIR GLEW_LIBRARY)
Call Stack (most recent call first):
  C:/Program Files/CMake/share/cmake-3.6/Modules/FindPackageHandleStandardArgs.cmake:388 (_FPHSA_FAILURE_MESSAGE)
  C:/Program Files/CMake/share/cmake-3.6/Modules/FindGLEW.cmake:44 (find_package_handle_standard_args)
  source/CMakeLists.txt:5 (find_package)
Run Code Online (Sandbox Code Playgroud)

FindGLEW.cmake 是否有可能损坏?我查看了其他几个 FindXXXXX.cmake 文件,它们就像雪花,每个都非常独特。所以我很难肯定地说它遵循惯例。

[1]将 GLEW 与 CMake 链接

was*_*ful 8

查看源代码,该包正在相对路径中查找 GLEW。使用不同的前缀搜索这些相对路径,包括变量的内容CMAKE_PREFIX_PATH

  • <prefix>/includeforfind_path用于查找包含目录。
  • <prefix>/lib用于find_library查找库。

假设C:/Program Files/glew/includeC:/Program Files/glew/lib存在,添加C:/Program Files/glew到您的CMAKE_PREFIX_PATH变量中。就像是:

list(APPEND CMAKE_PREFIX_PATH "C:/Program Files/glew")
find_package(GLEW REQUIRED)
Run Code Online (Sandbox Code Playgroud)

请注意以下几行:

include_directories(${GLEW_INCLUDE_DIRS})
link_libraries(${GLEW_LIBRARIES})
Run Code Online (Sandbox Code Playgroud)

可以使用导入的目标 Glew::Glew删除:

add_executable(foo ...)
target_link_libraries(foo Glew::Glew)
Run Code Online (Sandbox Code Playgroud)

  • 感谢您添加这一点。除了您发布的内容之外,这是我学到的内容。find_package 不会递归到它检查的正常文件夹之外的子文件夹。就我而言,我将 CMAKE_PREFIX_PATH 编辑为 C:\Program Files\glew。这是需要的。但这只允许 CMake 分别检查 CMAKE_PREFIX_PATH 和名为“lib”和“include”的子文件夹中的 .lib 文件和 .h 文件。所需的glew32s.lib 文件隐藏在C:\Program Files\glew\lib\Release\x64\glew32s.lib 中。在我在 lib 文件夹中复制了该 .lib 文件后,找到了该包。 (2认同)