Как собрать и установить GLFW 3 и использовать его в проекте Linux

94

GLFW3

Вчера вечером я допоздна работал, пытаясь собрать пакеты GLFW 3 для Linux из исходников. Этот процесс занял у меня очень много времени, в общей сложности около 3 часов, отчасти потому, что я не знаком с CMake, а отчасти потому, что я не был знаком с GLFW.

Надеюсь, этот пост избавит вас от вчерашних трудностей! Я подумал, что мне следует сделать короткое описание и, надеюсь, сэкономить вам несколько часов вашей жизни ...

Благодаря "urraka", "b6" и "niklas" на IRC-канале #glfw я смог заставить работать glfw версии 3.0.1.

Оказывается, это нетривиальный процесс (конечно, не для меня, я не эксперт), поскольку в Интернете не так много документации по glfw3, особенно по настройке его с помощью CMake.

Меня попросили разбить это на раздел вопросов и ответов, и я сделал это, и теперь части ответов приведены ниже.

Вы сопровождаете GLFW или являетесь членом команды GLFW?

Если кто-либо из сопровождающих GLFW3 увидит это, то я хотел бы сказать им, что добавьте на свой сайт раздел «Настройка GLFW3 в Windows, Mac OS X и Linux»! Писать программы с помощью GLFW довольно просто, так как онлайн-документация довольно хороша, быстрое сканирование всех доступных классов и модулей, и вы будете готовы к работе. Пример тестового проекта показал здесь тоже очень хорошо. Я обнаружил две основные проблемы: во-первых, как настроить GLFW3 в моей системе, а во-вторых, как создать проект GLFW3? Эти две вещи, возможно, недостаточно ясны для неспециалиста.

редактировать

Бегло взглянул сегодня (Дата: 2014-01-14), похоже, что веб-сайт GLFW претерпел серьезные изменения с тех пор, как я последний раз смотрел, и теперь есть раздел о компиляции GLFW и сборке программ с GLFW, которые, как мне кажется, являются новыми.

user3728501
источник
Спасибо, что разместили это здесь - очевидно, что для этого было проделано много работы. Не могли бы вы разбить его на вопрос и ответ? Вы можете добавить свой ответ на свой вопрос и отметить его как правильный.
Fraser
@Fraser Да, конечно, если вы думаете, что так будет лучше
user3728501
1
Я поддерживаю это. Мне очень нравится GLFW, но я был очень разочарован тем, что не нашел никакой документации о том, как скомпилировать v3 под Mac и т. Д.
user18490 02 авг.13,
1
@ user18490 Да, это меня удивило, так как GLFW кажется "лучшим переизбытком". Я уверен, что они упомянули в своей документации, что перенасыщение полезно только для обучения, и если вам нужна профессиональная оконная библиотека, используйте GLFW. Поэтому удивительно то, что они говорят вам, насколько он хорош, но не говорят, как его установить! (В отличие от SFML)
user3728501 02
@ Эдвард Берд. Наконец-то я нашел полезную информацию об установке GLFW на этой веб-странице: scratchapixel.com/lessons/3d-basic-lessons/lesson-2-get-started/…
user18490 03

Ответы:

127

Шаг 1. Установка GLFW 3 в вашу систему с помощью CMAKE

Для этой установки я использовал 64-битную версию KUbuntu 13.04.

Первым шагом является загрузка последней версии (при условии, что версии в будущем будут работать аналогичным образом) с www.glfw.org , возможно, используя эту ссылку .

Следующим шагом является извлечение архива и открытие терминала. cdв каталог glfw-3.XX и запустите, cmake -G "Unix Makefiles"вам могут потребоваться повышенные привилегии, и вам также может потребоваться сначала установить зависимости сборки . Для этого попробуйте sudo apt-get build-dep glfw или sudo apt-get build-dep glfw3 или сделайте это вручную , как я использовал sudo apt-get install cmake xorg-dev libglu1-mesa-dev... Могут быть другие библиотеки, которые вам потребуются, например библиотеки pthread ... По-видимому, они у меня уже были. (См. Параметры -l для этапа компоновщика g ++ ниже.)

Теперь вы можете ввести, makeа затем make install, что, вероятно, потребует от вас sudoсначала.

Хорошо, вы должны получить некоторый подробный вывод на последних трех этапах CMake, сообщающий вам, что было построено или где это было размещено. (В /usr/include, например.)

Шаг 2. Создайте тестовую программу и скомпилируйте

Следующим шагом является запуск vim (вы говорите «что ?! vim ?!») или предпочитаемого вами IDE / текстового редактора ... Я не использовал vim, я использовал Kate, потому что я использую KUbuntu 13.04 ... В любом случае скачайте или скопируйте тестовую программу отсюда (внизу страницы) и сохраните, выйдите.

Теперь скомпилируйте с использованием g++ -std=c++11 -c main.cpp- не уверен, требуется ли c ++ 11, но я использовал nullptrтак, мне это было нужно ... Возможно, вам потребуется обновить gcc до версии 4.7 или до версии 4.8 ... Информация об этом здесь .

Тогда исправляйте свои ошибки, если вы набирали программу вручную или пытались быть «слишком умными» и что-то не получалось ... Тогда свяжите это с помощью этого монстра! g++ main.o -o main.exec -lGL -lGLU -lglfw3 -lX11 -lXxf86vm -lXrandr -lpthread -lXiИтак, вы видите, что в части «установка зависимостей сборки» вы также можете проверить, установлены ли у вас библиотеки разработки GL, GLU, X11 Xxf86vm (что бы то ни было) Xrandr posix-thread и Xi (что бы то ни было) . Может быть, обновите и свои графические драйверы, я думаю, для GLFW 3 может потребоваться OpenGL версии 3 или выше? Может, кто-нибудь сможет это подтвердить? Вам также может потребоваться добавить параметры компоновщика, -ldl -lXinerama -lXcursorчтобы он работал правильно, если вы получаете неопределенные ссылки на dlclose(кредит на @ user2255242).

И да, мне действительно нужно было столько -ls!

Шаг 3: Все готово, хорошего дня!

Надеюсь, эта информация была верной, и все у вас работало, и вам понравилось писать тестовую программу GLFW. Кроме того, мы надеемся , что это руководство помогло, или поможет, несколько человек в будущем , которые изо всех сил , как я был сегодня вчера!

Кстати, все теги - это то, что я искал в stackoverflow в поисках ответа, которого не было. (До сих пор.) Надеюсь, это то, что вы искали, если бы находились в таком же положении, что и я.

Примечание автора:

Возможно, это не лучшая идея. Этот метод (с использованием sudo make install) может быть опасным для вашей системы. (См. Не ломайте Debian)

В идеале я или кто-то другой должен предложить решение, которое не просто устанавливает файлы lib и т. Д. В системные каталоги по умолчанию, поскольку ими должны управлять менеджеры пакетов, такие как apt, и это может вызвать конфликт и сломать вашу систему управления пакетами.

Альтернативное решение см. В новом «ответе 2020 года».

3728501
источник
Я часами пытался понять это. Этот ответ сработал для меня: Ubuntu 13.04, x64. IDE NetBeans C ++ (добавьте строку компоновщика в Project Properties-> Build-> Linker-> Libraries-> Add Option-> Other Option - в противном случае дословно следуйте инструкциям)
Скотт Дрю
Очевидно (с GLFW 3.0.3) что-то использует, powпоэтому добавление -lmк параметрам компиляции исправило это.
Forest Katsch
1
Эдвард, спасибо. Мне нужна была проверка работоспособности, чтобы все требования -l не означали, что я что-то делаю неправильно.
Ошибку 01
3
чувак ты ебаный ГЕНИЙ !!!! у вас есть 3 часа, у меня есть 3 дня, чтобы попытаться сделать это (собственно, исследую, с чего начать, читая об истории перенасыщения и так далее), спасибо, черт возьми; Я также хотел бы посоветовать, что я прочитал страницу glfw, не смог выполнить работу, следуя их руководству, почти сдался, когда нашел это, и они не объясняют так просто и прямо, как вы. отличная работа, которую вы здесь проделали !!
Виктор Р. Оливейра
1
На чистый Linux Mint мне пришлось установить следующие пакеты:sudo apt-get update && sudo apt-get install build-essential libevent-pthreads-2.0.5 doxygen xorg-dev libglu1-mesa-dev
Ленар Хойт
18

Я решил это таким образом

Файл pkg-config описывает все необходимые флаги времени компиляции и времени компоновки, а также зависимости, необходимые для использования библиотеки.

pkg-config --static --libs glfw3

показывает мне, что

-L/usr/local/lib -lglfw3 -lrt -lXrandr -lXinerama -lXi -lXcursor -lGL -lm -ldl -lXrender -ldrm -lXdamage -lX11-xcb -lxcb-glx -lxcb-dri2 -lxcb-dri3 -lxcb-present -lxcb-sync -lxshmfence -lXxf86vm -lXfixes -lXext -lX11 -lpthread -lxcb -lXau -lXdmcp  

Я не знаю, действительно ли все эти библиотеки необходимы для компиляции, но для меня это работает ...

Олег Помазан
источник
3
Этот ответ необходимо увидеть. Я раньше не знал о pkg-config. Но с сегодняшнего дня я буду использовать его до конца, потому что он поможет мне решить любую проблему с зависимостями ссылок. Спасибо за такой отличный ответ.
Sayan Bhattacharjee
18

Обратите внимание, что вам не нужно такое количество -ls, если вы устанавливаете glfw с BUILD_SHARED_LIBSопцией. (Вы можете включить эту опцию, запустив ccmakeсначала).

Таким образом sudo make installбудет установить общую библиотеку в /usr/local/lib/libglfw.so. Затем вы можете скомпилировать файл примера с помощью простого:

g++ main.cpp -L /usr/local/lib/ -lglfw

Затем не забудьте добавить / usr / local / lib / в путь поиска разделяемых библиотек перед запуском вашей программы. Это можно сделать с помощью:

export LD_LIBRARY_PATH=/usr/local/lib:${LD_LIBRARY_PATH}

И вы можете поместить это в свой, ~/.bashrcчтобы вам не приходилось все время печатать.

CastleDefender
источник
1
эта информация действительно важна для тех, кто хотел бы установить одну IDE вместо использования терминала для компиляции и запуска; Не могли бы вы подробнее рассказать, как это сделать? Я пытался, но безуспешно
Виктор Р. Оливейра
Нуб здесь! Я знаю, что это немного устарело, но мне это действительно помогло. Может ли кто-нибудь объяснить (или связать с кем-то объяснение), почему использование разделяемой библиотеки позволило бы нам не связывать все эти другие библиотеки, многие из которых также были общими объектными файлами? Кроме того, мне пришлось установить переменную LD_LIBRARY_PATH после компиляции, иначе я столкнулся с гневом ошибок GNU при попытке запустить свой недавно скомпилированный исполняемый файл.
Sammaron
1
Привет, Саммарон, спасибо за разговор о LD_LIBRARY_PATH, я обновлю свой ответ, включив это. Причина, по которой вам не нужно указывать все другие библиотеки при использовании библиотеки glfw, заключается в том, что glfw уже загружает их. Вы можете использовать эту команду, lddчтобы проверить, какие библиотеки загружаются программой при ее запуске. Это также хороший способ проверить, правильно ли найдены библиотеки. Вы можете использовать lddв своей программе и на /usr/local/lib/libglfw.so для сравнения.
CastleDefender
Спасибо за ответ! Кроме того, я хотел немного исправить себя: переменная LD_LIBRARY_PATH - жизнеспособное решение, но если библиотека была установлена ​​по стандартному пути, который загрузчик все равно будет искать, запуск sudo ldconfigдолжен решить эту проблему и не требовать настройки LD_LIBRARY_PATH каждый раз. В этом ответе обсуждается, почему это может быть предпочтительнее.
Sammaron
После создания общей сборки мне пришлось скомпилировать / связать 2 других. g ++ main.cpp -L / usr / local / lib / -lglfw -lGLU -lGL работал у меня.
Шридхар Тиагараджан
9

Поскольку принятый ответ не допускает дополнительных изменений, я собираюсь обобщить его с помощью одной команды копирования-вставки (замените 3.2.1 последней версией, доступной в первой строке):

version="3.2.1" && \
wget "https://github.com/glfw/glfw/releases/download/${version}/glfw-${version}.zip" && \
unzip glfw-${version}.zip && \
cd glfw-${version} && \
sudo apt-get install cmake xorg-dev libglu1-mesa-dev && \
sudo cmake -G "Unix Makefiles" && \
sudo make && \
sudo make install

Если вы хотите скомпилировать программу, используйте следующие команды:

g++ -std=c++11 -c main.cpp && \
g++ main.o -o main.exec -lGL -lGLU -lglfw3 -lX11 -lXxf86vm -lXrandr -lpthread -lXi -ldl -lXinerama -lXcursor

Если вы следуете руководству Learnopengl.com, возможно, вам также придется настроить GLAD. В таком случае нажмите на эту ссылку

http://glad.dav1d.de/#profile=core&specification=gl&api=gl%3D3.3&api=gles1%3Dnone&api=gles2%3Dnone&api=glsc2%3Dnone&language=c&loader=on

а затем нажмите кнопку «Создать» в правом нижнем углу веб-сайта и загрузите zip-файл. Извлеките его и скомпилируйте исходники с помощью следующей команды:

g++ glad/src/glad.c -c -Iglad/include

Теперь команды для компиляции вашей программы выглядят так:

g++ -std=c++11 -c main.cpp -Iglad/include && \
g++ main.o glad.o -o main.exec -lGL -lGLU -lglfw3 -lX11 -lXxf86vm -lXrandr -lpthread -lXi -ldl -lXinerama -lXcursor
Адриан
источник
2
Гениально! У меня работал на Ubuntu 16.04 с GLFW v3.2.1. Всего два незначительных исправления: set version = XXX должно быть просто version = "XXX" и в конце этой строки не должно быть .zip: cd glfw - $ {version} .zip
Тим
2

Отличный гид, спасибо. Учитывая большинство инструкций, он почти построен для меня, но у меня осталась одна ошибка.

/usr/bin/ld: //usr/local/lib/libglfw3.a(glx_context.c.o): undefined reference to symbol 'dlclose@@GLIBC_2.2.5'
//lib/x86_64-linux-gnu/libdl.so.2: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status

После поиска этой ошибки пришлось добавить -ldlв командную строку.

g++ main.cpp -lglfw3 -lX11 -lXrandr -lXinerama -lXi -lXxf86vm -lXcursor -lGL -lpthread -ldl

Затем был скомпилирован и связан образец приложения "hello GLFW".

Я новичок в Linux, поэтому я не совсем уверен, что именно делает эта дополнительная библиотека ... кроме исправления моей ошибки связывания. Однако я вижу этот переключатель строки cmd в сообщении выше.

user2941878
источник
У меня есть файлы .o и .exec .. пожалуйста, помогите мне в этом, как его запустить?
Буддхика Чатуранга
0

Если кто-то становится ленивым и, возможно, не знает, как настроить оболочку для всех этих библиотек и -l s, то я создал скрипт python (у вас должен быть python3, он есть у большинства пользователей Linux), который позволяет легко компилировать скрипты и запускать их, не беспокоясь, у него просто обычные системные вызовы, просто аккуратно организованные, я создал его для себя, но, возможно, он будет полезен: Вот это

mathmaniage
источник
0

Хорошо описанный ответ уже есть, но я использовал этот КОРОТКИЙ рецепт:

  1. Установите Linuxbrew
  2. $ brew install glfw
  3. cd /home/linuxbrew/.linuxbrew/Cellar/glfw/X.X/include
  4. sudo cp -R GLFW /usr/include

Объяснение: Нам удалось собрать GLFW с помощью CMAKE, который выполняется Linuxbrew (Linux-порт любимого Homebrew). Затем скопируйте файлы заголовков туда, откуда Linux читает ( /usr/include).

Шаян Амани
источник
0

2020 Обновленный ответ

Сейчас 2020 год (7 лет спустя), и за это время я узнал больше о Linux. В частности, это может быть не очень хорошая идея запускать sudo make installпри установке библиотек, поскольку они могут мешать системе управления пакетами. (В данном случае, aptпоскольку я использую Debian 10.)

Если это не так, поправьте меня в комментариях.

Альтернативное предлагаемое решение

Эта информация взята из документации GLFW, однако я расширил / упростил информацию, имеющую отношение к пользователям Linux.

  • Перейдите в домашний каталог и клонируйте репозиторий glfw из github
cd ~
git clone https://github.com/glfw/glfw.git
cd glfw
  • На этом этапе вы можете создать каталог сборки и следовать инструкциям здесь ( инструкции по сборке glfw ), однако я решил этого не делать. Следующая команда, похоже, все еще работает в 2020 году, однако в онлайн-инструкциях glfw это явно не указано.
cmake -G "Unix Makefiles"
  • Возможно, вам придется бежать sudo apt-get build-dep glfw3до (?). Я выполнил и эту команду, и sudo apt install xorg-devв соответствии с инструкциями.

  • Наконец запустить make

  • Теперь в каталоге вашего проекта сделайте следующее. (Перейдите в свой проект, который использует библиотеки glfw)

  • Создайте CMakeLists.txt, мой выглядит так

CMAKE_MINIMUM_REQUIRED(VERSION 3.7)
PROJECT(project)

SET(CMAKE_CXX_STANDARD 14)
SET(CMAKE_BUILD_TYPE DEBUG)

set(GLFW_BUILD_DOCS OFF CACHE BOOL "" FORCE)
set(GLFW_BUILD_TESTS OFF CACHE BOOL "" FORCE)
set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)

add_subdirectory(/home/<user>/glfw /home/<user>/glfw/src)


FIND_PACKAGE(OpenGL REQUIRED)

SET(SOURCE_FILES main.cpp)

ADD_EXECUTABLE(project ${SOURCE_FILES})
TARGET_LINK_LIBRARIES(project glfw)
TARGET_LINK_LIBRARIES(project OpenGL::GL)
  • Если вам не нравится CMake, прошу прощения, но, на мой взгляд, это самый простой способ быстро запустить ваш проект. Я бы рекомендовал научиться пользоваться им, по крайней мере, на базовом уровне. К сожалению, я не знаю ни одного хорошего руководства по CMake.

  • Затем сделайте cmake .и make, ваш проект должен быть построен и связан с общей библиотекой glfw3

  • Есть способ создать динамически связанную библиотеку. Я полагаю, что использовал здесь статический метод. Прокомментируйте / добавьте раздел в этот ответ ниже, если вы знаете больше, чем я

  • Это должно работать в других системах, если не дайте мне знать, и я помогу, если смогу

user3728501
источник