Я новичок в 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.
«Я даже добавил строку 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: 1. Я пробовал оба варианта, но ни один из них не удался. 2. Я запустил cmake, используя флаги отладки вокруг оператора, и он перечислил найденный путь. Я сделал то же самое для оригинального find_package(GLEW REQUIRED)
, и он находит FindGLEW.cmake
и GLEWConfig.cmake
в тех местах, где я ожидал (т. Е. Там, где они были установлены brew)
Выложите полностью сообщение об ошибке. Кроме того, прежде чем вы это сделаете, используйте импортированную цель GLEW::GLEW
вместо {GLEW_LIBRARIES}
, это, скорее всего, вызвано чем-то другим, что вы не публикуете здесь и не замечаете. Обновлено: Просто чтобы мы понимали друг друга, я хочу весь вывод cmake -S. -Bbuild
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 Возможно, они используют более старый файл FindXYZ.cmake
. Дополнительный вариант заключается в том, что, поскольку он плохо написан, вы вместо этого выбираете файл GLEWConfig.cmake
и т. д., Который может вообще устанавливать разные переменные. Измените CMakeLists.txt
и посмотрите, что произойдет — не предоставив нам реальный проект, мы больше ничего не можем вам рассказать об этом. Однако, учитывая, что вы получаете ошибку, которую вы получаете, мой ответ, скорее всего, является возможным решением.
@Borage В общем, позвольте мне заверить вас, что большинство файлов CMakeLists.txt
настолько плохо написаны, что эти проблемы более чем распространены. Возможно, мы могли бы указать на некоторые проблемы с ним, если бы перед нами был настоящий файл (вставленный в вопрос).
@MilanŠ.: Обратите внимание, что сообщение об ошибке не обязательно должно быть вызвано тем, что проект обращается именно к переменной GLEW_LIBRARY
. Вполне возможно, что проект обращается (правильно!) к переменной GLEW_LIBRARIES
, но последняя строится с использованием значения переменной GLEW_LIBRARY
. Технически сообщение об ошибке вызвано значением GLEW_LIBRARY-NOTFOUND
, найденным в некотором свойстве цели в конце процесса настройки. Обычно такое значение создается только вызовом find_library(GLEW_LIBRARY)
, поэтому CMake сообщает о переменной GLEW_LIBRARY
.
@Tsyvarev Как упомянул Borage, они активно используют переменную, а также получают определенный CMake Error: The following variables are used in this project, ...
, который указывает, что они действительно используют GLEW_LIBRARY
вместо правильных переменных или псевдонимов.
Замена ${GLEW_LIBRARIES}
на GLEW::GLEW
помогла, спасибо! cmake теперь завершается успешно. Не могли бы вы объяснить, почему ${GLEW_LIBRARIES}
не работает для GLEW, а ${OPENGL_LIBRARIES}
(который был связан в той же строке в моем коде) работает? Или я должен изменить это на одну из импортированных целей?
Нет, вы не должны. Все зависит от автора библиотеки (или файлов-предшественников файла xyz-config.cmake
). Некоторые люди склонны определять специальные «псевдонимы», которые делают все за вас. Некоторые просто используют старый способ определения набора переменных. Это действительно зависит от библиотеки. Я бы не стал слишком беспокоиться об этом.
Я ответил на ваш вопрос, однако в следующий раз я настоятельно рекомендую скопировать и вставить файл
CMakeLists.txt
, который вы используете в своем проекте.