Як побудувати та встановити GLFW 3 та використовувати його у проекті Linux


95

GLFW3

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

Сподіваюсь, ця публікація позбавить вас від труднощів, які були у мене вчора! Я подумав, що повинен зробити короткий запис, і, сподіваюся, врятує вас кілька годин вашого життя ...

Завдяки "urraka", "b6" і "niklas" на IRG-каналі #glfw, мені вдалося запустити glfw версії 3.0.1.

Виявляється, це не тривіальний процес (звичайно не для мене, я не фахівець), оскільки в Інтернеті не так багато документації про glfw3, особливо про налаштування його за допомогою CMake.

Мене попросили розділити це на розділ запитань та відповідей, і тому я це зробив, а частини відповідей тепер наведені нижче.

Ви підтримуєте GLFW або член команди GLFW?

Якщо хтось із тих, хто займається підтримкою GLFW3, це бачить, то моє повідомлення їм, будь ласка, додайте до свого веб-сайту розділ "Налаштування GLFW3 для Windows, Mac OS X та Linux"! Написати програми за допомогою GLFW досить просто, оскільки онлайн-документація досить гарна, швидко скануйте всі доступні класи та модулі, і ви будете готові до роботи. Приклад тестового проекту показав тут теж дуже добре. Я виявив дві основні проблеми: по-перше, як налаштувати GLFW3 у своїй системі, а по-друге, як створити проект GLFW3? Ці дві речі, можливо, недостатньо зрозумілі для непрофесіонала.

Редагувати

Подивившись сьогодні (Дата: 14.01.2014), здається, що веб-сайт GLFW зазнав серйозних змін з мого останнього перегляду, і зараз є розділ про складання GLFW та побудову програм з GLFW, які, на мою думку, є новими.


Дякую, що розмістили це тут - очевидно, що над цим було покладено багато роботи. Не могли б ви розділити це на питання та відповідь? Ви можете додати власну відповідь до власного запитання та позначити її як правильну.
Фрейзер

@Fraser Так, звичайно, якщо ви вважаєте, що так було б краще
user3728501

1
Я заперечую це. Мені дуже подобається GLFW, але я справді був розчарований тим, що не знайшов жодної документації щодо того, як скомпілювати v3 під Mac тощо
user18490

1
@ user18490 Так, мене це здивувало, оскільки GLFW, здається, "кращий перенасичення". Я впевнений, що вони згадували у своїй документації, що перенасичення корисно лише для навчання, і якщо ви хочете отримати професійну віконну бібліотеку, використовуйте GLFW. Тож дивно, що вони кажуть вам, наскільки це добре, але не говорять, як його встановити! (Зовсім на відміну від SFML)
user3728501

@Edward Bird. Нарешті я знайшов корисну інформацію на цій веб-сторінці щодо встановлення GLFW: scratchapixel.com/lessons/3d-basic-lessons/lesson-2-get-started/…
user18490

Відповіді:


125

Крок 1: Встановлення GLFW 3 у вашій системі за допомогою CMAKE

Для цього встановлення я використовував KUbuntu 13.04, 64-бітний.

Першим кроком є ​​завантаження останньої версії (припускаючи, що версії в майбутній роботі будуть аналогічним чином) з 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).

І так, мені справді потрібно було стільки -lс!

Крок 3: Ви закінчили, приємного дня!

Сподіваємось, ця інформація була правильною, і все працювало для вас, і вам сподобалось писати тестову програму GLFW. Також сподіваємось, що цей посібник допоміг або допоможе кільком людям у майбутньому, які боролись, як я сьогодні вчора!

До речі, усі теги - це те, що я шукав на stackoverflow, шукаючи відповіді, якої не було. (Дотепер.) Сподіваємось, це саме те, що ви шукали, якби ви були в подібному становищі, як я.

Примітка автора:

Це може бути поганою ідеєю. Цей метод (за допомогою sudo make install) може бути шкідливим для вашої системи. (Див. Не розбивайте Debian)

В ідеалі я або хтось інший повинен запропонувати рішення, яке не просто встановлює файли lib тощо у системні каталоги за замовчуванням, оскільки ними повинні керувати такі менеджери пакетів, як aptце може призвести до конфлікту та зламати вашу систему управління пакетами.

Дивіться нову «відповідь 2020» для альтернативного рішення.


Я годинами намагався це зрозуміти. Ця відповідь спрацювала для мене: Ubuntu 13.04, x64. IDB NetBeans C ++ (додайте рядок зв’язування у Властивості проекту-> Збірка-> Зв'язування-> Бібліотеки-> Додати опцію-> Інший варіант - інакше дотримуйтесь інструкцій дослівно)
Скотт Дрю

Очевидно (з GLFW 3.0.3) щось використовується, powтому додавання -lmдо параметрів компіляції це виправило.
Форест Кач

1
Едвард, дякую. Мені потрібна була ця перевірка осудності, щоб усі вимоги -l означали не лише те, що я роблю щось не так.
неправильно

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так що вам не доведеться весь час його друкувати.


1
ця інформація дійсно важлива для тих, хто хотів би встановити одну IDE замість використання терміналу для компіляції та запуску; Не могли б ви дати докладнішу інформацію про те, як це зробити? Я намагався, але не вдався
Віктор Р. Олівейра,

Нуб тут! Я знаю, що це трохи давно, але це мені справді допомогло. Хтось може пояснити (або посилатися на когось, хто пояснює), чому використання спільної бібліотеки зробить це таким чином, що нам не доведеться пов’язувати всі інші бібліотеки, багато з яких також були спільними файлами об’єктів? Крім того, мені довелося встановити змінну LD_LIBRARY_PATH після компіляції, або зіткнутися з гнівом помилок gnu, коли я намагаюся запустити свій щойно скомпільований виконуваний файл.
Саммарон

1
Привіт Саммароне, дякую за розмову про LD_LIBRARY_PATH, я оновлю свою відповідь, включивши це. Причиною того, що вам не потрібно вказувати всі інші бібліотеки під час використання бібліотеки glfw, є те, що glfw їх вже завантажує. За допомогою команди lddможна перевірити, які бібліотеки завантажує програма під час її запуску. Це також хороший спосіб перевірити, чи правильно знайдено бібліотеки. Ви можете використовувати lddу своїй програмі та на /usr/local/lib/libglfw.so для порівняння.
CastleDefender

Дякую за відповідь! Крім того, я хотів трохи виправити себе: змінна LD_LIBRARY_PATH є життєздатним рішенням, але якщо бібліотека була встановлена ​​у стандартному шляху, який завантажувач все одно буде шукати, запуск sudo ldconfigповинен вирішити цю проблему і не вимагати налаштування LD_LIBRARY_PATH кожного разу. Ця відповідь дає дискусію щодо того, чому це може бути кращим.
Саммарон

Після спільного використання build, мені довелося скомпілювати / зв’язати 2 інших. g ++ main.cpp -L / usr / local / lib / -lglfw -lGLU -lGL працював у мене.
Шрідхара Тіагараян

9

Оскільки прийнята відповідь не дозволяє більше редагувань, я збираюся підсумувати її за допомогою однієї команди copy-paste (замінити 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 у пості вище.


Я отримав файл .o та .exec .. допоможіть мені це, як його запустити?
Буддхіка Чатуранга

0

Якщо хтось лінується і, можливо, можливо, не знає, як налаштувати оболонку для всіх цих бібліотек та -l , то я створив скрипт python (у вас повинен бути python3, у більшості користувачів Linux це є), який дозволяє легко компілювати сценарії та запускати їх, не турбуючись, він просто має регулярні системні дзвінки, просто впорядковано, я створив його для себе, але, можливо, це було б корисно: Ось воно


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 libs)

  • Створіть 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

  • Існує певний спосіб створити динамічну пов'язану бібліотеку. Я вважаю, що використовував тут статичний метод. Будь ласка, коментуйте / додайте розділ у цій відповіді нижче, якщо ви знаєте більше, ніж я

  • Це має спрацювати в інших системах, якщо не повідомте мене, і я допоможу, якщо зможу

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.