Ошибка CMake: для переменной установлено значение NOTFOUND даже после ее определения вручную

Я новичок в cmake и пытаюсь создать существующий репозиторий, основанный на GLEW. Я установил GLEW с помощью Homebrew и теперь пытаюсь запустить cmake . Шаг ​​настройки завершен, но шаг генерации вызывает следующую ошибку:

CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
Please set them or make sure they are set and tested correctly in the CMake files:
GLEW_LIBRARY

Я проверил/попробовал следующее:

  • CMakeLists.txt содержит строку find_package(GLEW REQUIRED), которая не является ошибкой. Я даже добавил строку FIND_LIBRARY(GLEW_LIBRARY NAMES libGLEW.dylib PATHS /opt/local/lib /usr/local/lib /usr/lib REQUIRED), чтобы явно указать cmake, где искать библиотеку, и она находит правильный путь.
  • Есть файл FindGlew.cmake, который был помещен в /usr/local/Cellar/cmake/3.25.2/share/cmake/Modules (полагаю, во время самодельной установки GLEW). Он содержит строку unset(GLEW_LIBRARY). Я немного не решаюсь возиться с файлом (в этом нет необходимости, верно?), но я попытался закомментировать эту строку и снова запустить cmake, но это не дало никакого эффекта.
  • CMakeCache.txt содержит переменные GLEW_LIBRARY_DEBUG и GLEW_LIBRARY_RELEASE, которые были установлены на GLEW_LIBRARY_DEBUG-NOTFOUND и т. д. Я отредактировал их вручную, указав путь к файлу libGLEW.dylib и добавил дополнительный путь, который я назвал GLEW_LIBRARY, но безрезультатно.
  • CMakeCache.txt также содержит переменную GLEW_DIR, которая определена. Есть GLEW_LIBRARY_DIR, который тоже NOTFOUND.
  • Я передал переменную как явную команду, используя cmake . -DGLEW_LIBRARY=/usr/local/lib/libGLEW.dylib. Я пробовал это как с предварительным удалением кеша, так и без него.
  • Статически определите библиотеку, используя подход, описанный в этом ответе.
  • brew reinstall glew.

У меня также установлен OpenGL, но он собран из исходников (не через Homebrew). Может быть, это как-то связано с тем, что они неправильно связаны? OpenGL правильно находит CMakeLists.txt, поэтому cmake должен каким-то образом получить доступ к своему пути.

Обновлено: это (MWE) файл CMakeLists.txt:

cmake_minimum_required (VERSION 3.15)

project ("ProjectName" LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(OpenGL REQUIRED)
include_directories( ${OPENGL_INCLUDE_DIRS} )
# set(CMAKE_FIND_DEBUG_MODE TRUE)
find_package(GLEW REQUIRED)
# set(CMAKE_FIND_DEBUG_MODE FALSE)
include_directories(${GLEW_INCLUDE_DIRS})

file(GLOB sources CONFIGURE_DEPENDS src/*.cpp src/*.hpp *src/.h)
add_executable(${PROJECT_NAME} ${sources})

target_link_libraries(${PROJECT_NAME} ${OPENGL_LIBRARIES} ${GLEW_LIBRARIES})

file(COPY ${RESOURCE_FILES} DESTINATION ${CMAKE_BINARY_DIR}/Resources)

Обновлено: для полноты, вот полный вывод/сообщение об ошибке:

-- The CXX compiler identification is AppleClang 14.0.0.14000029
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /Library/Developer/CommandLineTools/usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found OpenGL: /Library/Developer/CommandLineTools/SDKs/MacOSX13.1.sdk/System/Library/Frameworks/OpenGL.framework   
-- Found GLEW: /usr/local/lib/cmake/glew/glew-config.cmake  
-- Configuring done
CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
Please set them or make sure they are set and tested correctly in the CMake files:
GLEW_LIBRARY
    linked by target "ProjectName" in directory /Users/user1/dev/project

-- Generating done
CMake Generate step failed.  Build files cannot be regenerated correctly.

Я ответил на ваш вопрос, однако в следующий раз я настоятельно рекомендую скопировать и вставить файл CMakeLists.txt, который вы используете в своем проекте.

Milan Š. 09.02.2023 17:13

«Я даже добавил строку FIND_LIBRARY(GLEW_LIBRARY NAMES libGLEW.dylib PATHS /opt/local/lib /usr/local/lib /usr/lib REQUIRED), чтобы явно указать cmake, где искать библиотеку, и она находит правильный путь». - 1. Где именно вы добавили эту строку, перед find_package(GLEW REQUIRED) или после нее? 2. Как вы думаете, почему CMake действительно находит правильный путь? (find_library поддерживает REQUIRED только для проекта, настроенного для CMake 3.18 или более поздней версии). Судя по сообщению об ошибке, ровно find_library(GLEW_LIBRARY) вызов не работает.

Tsyvarev 09.02.2023 17:26

Милан: Спасибо за предложение, теперь я добавил (укороченную версию) файл, который все еще вызывает ошибку.

Borage 09.02.2023 18:09

@Tsyvarev: 1. Я пробовал оба варианта, но ни один из них не удался. 2. Я запустил cmake, используя флаги отладки вокруг оператора, и он перечислил найденный путь. Я сделал то же самое для оригинального find_package(GLEW REQUIRED), и он находит FindGLEW.cmake и GLEWConfig.cmake в тех местах, где я ожидал (т. Е. Там, где они были установлены brew)

Borage 09.02.2023 18:14

Выложите полностью сообщение об ошибке. Кроме того, прежде чем вы это сделаете, используйте импортированную цель GLEW::GLEW вместо {GLEW_LIBRARIES}, это, скорее всего, вызвано чем-то другим, что вы не публикуете здесь и не замечаете. Обновлено: Просто чтобы мы понимали друг друга, я хочу весь вывод cmake -S. -Bbuild

Milan Š. 09.02.2023 21:22
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
5
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

EDIT2: согласно FindGLEW вы должны использовать одну из импортированных целей - GLEW::GLEW т.е.

target_link_libraries(your_target GLEW::GLEW ... )

Я также хотел бы попросить вас опубликовать новые ошибки, которые вы получаете, связанные с опубликованным вами MRE. Я обновлю свой ответ соответственно.


Обновлено: Потому что вы упомянули, что некоторые люди могут его скомпилировать, а некоторые нет. Посмотрите вот на эту строку:

find_package(GLEW CONFIG QUIET)

if (GLEW_FOUND)
#...

Эта строка пытается найти фактический файл GLEWConfig.cmake для настройки. Это означает, что если вы установили пакет ИЛИ у вас есть этот файл GLEWConfig.cmake, вы получите другие результаты.

Моя рекомендация: выясните, как именно они установили свой GLEW (или скомпилировали ли они его) и воссоздайте точно такую ​​же среду.


Вот ссылка на FindGLEW.cmake . В строках 41-58 вы можете увидеть переменные, которые вы можете использовать в своем проекте. НЕТ GLEW_LIBRARY.

Если вы посмотрите в файл, вы увидите, почему:

if (GLEW_FOUND)
  find_package_handle_standard_args(GLEW DEFAULT_MSG GLEW_CONFIG)
  get_target_property(GLEW_INCLUDE_DIRS GLEW::GLEW INTERFACE_INCLUDE_DIRECTORIES)
  set(GLEW_INCLUDE_DIR ${GLEW_INCLUDE_DIRS})
  get_target_property(_GLEW_DEFS GLEW::GLEW INTERFACE_COMPILE_DEFINITIONS)
  if ("${_GLEW_DEFS}" MATCHES "GLEW_STATIC")
    get_target_property(GLEW_LIBRARY_DEBUG GLEW::GLEW IMPORTED_LOCATION_DEBUG)
    get_target_property(GLEW_LIBRARY_RELEASE GLEW::GLEW IMPORTED_LOCATION_RELEASE)
  else()
    get_target_property(GLEW_LIBRARY_DEBUG GLEW::GLEW IMPORTED_IMPLIB_DEBUG)
    get_target_property(GLEW_LIBRARY_RELEASE GLEW::GLEW IMPORTED_IMPLIB_RELEASE)
  endif ()
  get_target_property(_GLEW_LINK_INTERFACE GLEW::GLEW IMPORTED_LINK_INTERFACE_LIBRARIES_RELEASE) # same for debug and release
  list(APPEND GLEW_LIBRARIES ${_GLEW_LINK_INTERFACE})
  list(APPEND GLEW_LIBRARY ${_GLEW_LINK_INTERFACE})
  select_library_configurations(GLEW)
  if ("${_GLEW_DEFS}" MATCHES "GLEW_STATIC")
    set(GLEW_STATIC_LIBRARIES ${GLEW_LIBRARIES})
  else()
    set(GLEW_SHARED_LIBRARIES ${GLEW_LIBRARIES}) 
  endif ()
  unset(_GLEW_DEFS)
  unset(_GLEW_LINK_INTERFACE)
  unset(GLEW_LIBRARY) #<-- here the temporary variable is unset
  unset(GLEW_LIBRARY_DEBUG)
  unset(GLEW_LIBRARY_RELEASE)
  return()
endif ()

GLEW_LIBRARY — это временная переменная, используемая для установки других переменных.

Вместо этого вы хотите использовать: GLEW_LIBRARIES

GLEW_LIBRARY используется внутри существующего проекта, который я пытаюсь скомпилировать (это исследовательский проект, к которому я присоединяюсь). Я еще не вносил никаких изменений в код (кроме приведенных выше попыток отладки для сборки кода). Можно ли с уверенностью сказать, что разработчик этого проекта ошибочно назвал переменную? Однако они могут создавать код без каких-либо проблем.
Borage 09.02.2023 17:14

@Borage Возможно, они используют более старый файл FindXYZ.cmake. Дополнительный вариант заключается в том, что, поскольку он плохо написан, вы вместо этого выбираете файл GLEWConfig.cmake и т. д., Который может вообще устанавливать разные переменные. Измените CMakeLists.txt и посмотрите, что произойдет — не предоставив нам реальный проект, мы больше ничего не можем вам рассказать об этом. Однако, учитывая, что вы получаете ошибку, которую вы получаете, мой ответ, скорее всего, является возможным решением.

Milan Š. 09.02.2023 17:17

@Borage В общем, позвольте мне заверить вас, что большинство файлов CMakeLists.txt настолько плохо написаны, что эти проблемы более чем распространены. Возможно, мы могли бы указать на некоторые проблемы с ним, если бы перед нами был настоящий файл (вставленный в вопрос).

Milan Š. 09.02.2023 17:19

@MilanŠ.: Обратите внимание, что сообщение об ошибке не обязательно должно быть вызвано тем, что проект обращается именно к переменной GLEW_LIBRARY. Вполне возможно, что проект обращается (правильно!) к переменной GLEW_LIBRARIES, но последняя строится с использованием значения переменной GLEW_LIBRARY. Технически сообщение об ошибке вызвано значением GLEW_LIBRARY-NOTFOUND, найденным в некотором свойстве цели в конце процесса настройки. Обычно такое значение создается только вызовом find_library(GLEW_LIBRARY), поэтому CMake сообщает о переменной GLEW_LIBRARY.

Tsyvarev 09.02.2023 17:40

@Tsyvarev Как упомянул Borage, они активно используют переменную, а также получают определенный CMake Error: The following variables are used in this project, ..., который указывает, что они действительно используют GLEW_LIBRARY вместо правильных переменных или псевдонимов.

Milan Š. 09.02.2023 17:57

Замена ${GLEW_LIBRARIES} на GLEW::GLEW помогла, спасибо! cmake теперь завершается успешно. Не могли бы вы объяснить, почему ${GLEW_LIBRARIES} не работает для GLEW, а ${OPENGL_LIBRARIES} (который был связан в той же строке в моем коде) работает? Или я должен изменить это на одну из импортированных целей?

Borage 09.02.2023 22:00

Нет, вы не должны. Все зависит от автора библиотеки (или файлов-предшественников файла xyz-config.cmake). Некоторые люди склонны определять специальные «псевдонимы», которые делают все за вас. Некоторые просто используют старый способ определения набора переменных. Это действительно зависит от библиотеки. Я бы не стал слишком беспокоиться об этом.

Milan Š. 09.02.2023 22:04

Другие вопросы по теме