4

I've read this [1], but in my case CMake says it can't find glew.

I'm on Windows and there is a FindGLEW.cmake file in my CMake modules folder, presumably put there when I installed CMake-3.6. I found GLEW on sourceforge and downloaded the zip file for Windows. I unzipped and installed in C:\Program Files\glew. When I've created my own libraries and used CMake to build and install them, this is the default location they are installed to so I am pretty confident I'm OK here.

The snippet from my CMakeLists.txt is:

find_package(GLEW REQUIRED)
include_directories(${GLEW_INCLUDE_DIRS})
link_libraries(${GLEW_LIBRARIES})

The actual error message from CMake is:

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)

Is it possible the FindGLEW.cmake is broken? I've looked at a couple of other FindXXXXX.cmake files and they are like snowflakes, each one pretty unique. So it's hard for me to say with any certainty that it's following convention.

[1] Linking GLEW with CMake

Community
  • 1
  • 1
Rich von Lehe
  • 1,362
  • 2
  • 16
  • 38

1 Answers1

7

Looking in the sources, the package is looking for GLEW in relative paths. These relative paths are searched using different prefixes, including the content of the variable CMAKE_PREFIX_PATH:

  • <prefix>/include for find_path which is used to find include directories.
  • <prefix>/lib for find_library which is used to find libraries.

Assuming C:/Program Files/glew/include and C:/Program Files/glew/lib exist, add C:/Program Files/glew to your CMAKE_PREFIX_PATH variable. Something like:

list(APPEND CMAKE_PREFIX_PATH "C:/Program Files/glew")
find_package(GLEW REQUIRED)

Note that the following lines:

include_directories(${GLEW_INCLUDE_DIRS})
link_libraries(${GLEW_LIBRARIES})

may be dropped using imported target Glew::Glew:

add_executable(foo ...)
target_link_libraries(foo Glew::Glew)
rocambille
  • 15,398
  • 12
  • 50
  • 68
  • 1
    Thanks for adding that. Here's what I learned in addition to what you posted. find_package doesn't recurse into subfolders beyond the normal folders it checks. In my case, I edited CMAKE_PREFIX_PATH to be C:\Program Files\glew. This was needed. But this just allows CMake to check CMAKE_PREFIX_PATH and subfolders named 'lib' and 'include' for .lib files and .h files, respectively. The needed glew32s.lib file is buried in C:\Program Files\glew\lib\Release\x64\glew32s.lib. After I made a copy of that .lib file in the lib folder the package was found. – Rich von Lehe Oct 27 '16 at 18:30
  • Just one more note: had I used CMake to build glew from sources, I am confident it knows how to arrange the resulting package so that it is more easily found. I think my troubles were more a result of a folder structure set up by sourceforge or whoever put together the zip file that I downloaded to get a precompiled version of glew. – Rich von Lehe Oct 27 '16 at 18:33