Jak zbudować i zainstalować GLFW 3 i używać go w projekcie Linux

95

GLFW3

Ostatniej nocy pracowałem do późna, próbując zbudować pakiety GLFW 3 dla Linuksa ze źródeł. Ten proces zajął mi bardzo dużo czasu, w sumie około 3 godzin, częściowo dlatego, że nie znam CMake, a częściowo dlatego, że nie znałem GLFW.

Mam nadzieję, że ten post uchroni Cię przed trudnością, którą miałem wczoraj! Pomyślałem, że powinienem napisać krótki opis i miejmy nadzieję, że zaoszczędzę ci kilku godzin twojego życia ...

Dzięki "urraka", "b6" i "niklas" na kanale IRC #glfw mogłem uruchomić glfw w wersji 3.0.1.

Okazuje się, że nie jest to trywialny proces (na pewno nie dla mnie, nie jestem ekspertem), ponieważ w sieci nie ma zbyt wielu dokumentacji na temat glfw3, szczególnie na temat konfigurowania go za pomocą CMake.

Poproszono mnie o podzielenie tego na sekcję pytań i odpowiedzi, więc zrobiłem to, a części odpowiedzi znajdują się teraz poniżej.

Czy jesteś opiekunem GLFW lub członkiem zespołu GLFW?

Jeśli któryś z opiekunów GLFW3 zobaczy to, moja wiadomość do nich jest taka, aby dodać sekcję "konfigurowanie GLFW3 w systemie Windows, Mac OS X i Linux" do swojej witryny! Pisanie programów w GLFW jest dość łatwe, ponieważ dokumentacja online jest całkiem dobra, szybkie skanowanie wszystkich dostępnych klas i modułów i będziesz gotowy do pracy. Przykładem projektu badawczego opisywany tutaj jest również bardzo dobra. Dwa główne problemy, które znalazłem, to: po pierwsze, jak skonfigurować GLFW3 w moim systemie, a po drugie, jak zbudować projekt GLFW3? Te dwie rzeczy być może nie są wystarczająco jasne dla osoby niebędącej ekspertem.

Edytować

Rzuciłem dzisiaj krótkie spojrzenie (Data: 2014-01-14), wygląda na to, że strona GLFW przeszła duże zmiany od czasu, gdy ostatnio przeglądałem, i jest teraz sekcja o kompilowaniu GLFW i tworzeniu programów w GLFW, które moim zdaniem są nowe.

user3728501
źródło
Dzięki za umieszczenie tego tutaj - oczywiście włożono w to dużo pracy. Czy mógłbyś jednak podzielić to na pytanie i odpowiedź? Możesz dodać własną odpowiedź na swoje pytanie i oznaczyć ją jako poprawną.
Fraser,
@Fraser Tak, oczywiście, jeśli uważasz, że tak będzie lepiej
user3728501
1
Popieram to. Bardzo lubię GLFW, ale byłem naprawdę sfrustrowany, że nie znalazłem żadnej dokumentacji dotyczącej kompilacji v3 na Macu itp.
user18490
1
@ user18490 Tak, wydało mi się to trochę zaskakujące, ponieważ GLFW wydaje się być „lepszym nadmiarem”. Jestem pewien, że wspomnieli w swojej dokumentacji, że glut jest dobry tylko do nauki, a jeśli chcesz mieć profesjonalną bibliotekę okien, użyj GLFW. Zaskakujące jest więc to, że mówią ci, jaki jest dobry, ale nie mówią, jak go zainstalować! (Zupełnie inaczej niż
SFML
@Edward Bird. W końcu znalazłem kilka przydatnych informacji na tej stronie dotyczące instalowania GLFW: scratchapixel.com/lessons/3d-basic-lessons/lesson-2-get-started/...
user18490

Odpowiedzi:

130

Krok 1: Instalacja GLFW 3 w systemie za pomocą CMAKE

W tej instalacji korzystałem z KUbuntu 13.04, 64-bitowego.

Pierwszym krokiem jest pobranie najnowszej wersji (zakładając, że wersje w przyszłości będą działać podobnie) ze strony www.glfw.org , prawdopodobnie korzystając z tego linku .

Następnym krokiem jest wyodrębnienie archiwum i otwarcie terminala. cddo katalogu glfw-3.XX i uruchom cmake -G "Unix Makefiles", możesz potrzebować podwyższonych uprawnień, a także może być konieczne wcześniejsze zainstalowanie zależności kompilacji . Aby to zrobić, spróbuj sudo apt-get build-dep glfw lub sudo apt-get build-dep glfw3 lub zrobić to ręcznie , jak ja za pomocą sudo apt-get install cmake xorg-dev libglu1-mesa-dev... Mogą być też inne libs wymagany jest takie jak biblioteki pthread ... Widocznie miałem ich już. (Zobacz opcje -l podane dla etapu linkera g ++ poniżej.)

Teraz możesz pisać, makea potem make install, co prawdopodobnie będzie wymagało od Ciebie sudopierwszego.

Okay, powinieneś otrzymać szczegółowe dane wyjściowe z ostatnich trzech etapów CMake, informujące o tym, co zostało zbudowane lub gdzie zostało umieszczone. (Na /usr/includeprzykład.)

Krok 2: Utwórz program testowy i skompiluj

Następnym krokiem jest odpalenie vima ("co ?! vim ?!" mówisz) lub twojego preferowanego IDE / edytora tekstu ... Nie używałem vima, użyłem Kate, ponieważ jestem na KUbuntu 13.04 ... W każdym razie pobierz lub skopiuj program testowy stąd (na dole strony) i zapisz, zakończ.

Teraz skompiluj za pomocą g++ -std=c++11 -c main.cpp- nie jestem pewien, czy c ++ 11 jest wymagane, ale użyłem nullptrtak, potrzebowałem go ... Być może będziesz musiał zaktualizować swoje gcc do wersji 4.7 lub nadchodzącej wersji 4.8 ... Informacje o tym tutaj .

Następnie napraw błędy, jeśli wpisałeś program ręcznie lub próbowałeś być „zbyt sprytny” i coś nie działało ... Następnie połącz go za pomocą tego potwora! g++ main.o -o main.exec -lGL -lGLU -lglfw3 -lX11 -lXxf86vm -lXrandr -lpthread -lXiWięc widzisz, w części "Zainstaluj zależności kompilacji", możesz również chcieć sprawdzić, czy masz zainstalowane biblioteki deweloperskie GL, GLU, X11 Xxf86vm (cokolwiek to jest) Xrandr posix-thread i Xi (cokolwiek to jest) . Może zaktualizuj też sterowniki graficzne, myślę, że GLFW 3 może wymagać OpenGL w wersji 3 lub wyższej? Może ktoś może to potwierdzić? Może być również konieczne dodanie opcji konsolidatora -ldl -lXinerama -lXcursor, aby działał poprawnie, jeśli otrzymujesz niezdefiniowane odwołania do dlclose(kredyt dla @ user2255242).

I tak, naprawdę potrzebowałem tylu -l!

Krok 3: Skończyłeś, miłego dnia!

Mam nadzieję, że te informacje były poprawne i wszystko działało, a pisanie programu testowego GLFW sprawiało Ci przyjemność. Również mam nadzieję, że ten przewodnik pomógł, czy pomoże, kilka osób w przyszłości, którzy walczą jak byłem dzisiaj wczoraj!

Nawiasem mówiąc, wszystkie tagi to rzeczy, których szukałem w stackoverflow, szukając odpowiedzi, która nie istniała. (Aż do teraz.) Mam nadzieję, że są one tym, czego szukałeś, gdybyś był w podobnej sytuacji co ja.

Uwaga autora:

To może nie być dobry pomysł. Ta metoda (używając sudo make install) może być niebezpieczna dla twojego systemu. (Zobacz Nie psuj Debiana)

W idealnym przypadku ja lub ktoś inny powinien zaproponować rozwiązanie, które nie tylko instaluje pliki lib itp. W domyślnych katalogach systemu, ponieważ powinny one być zarządzane przez menedżerów pakietów, takich jak apt, a zrobienie tego może spowodować konflikt i zepsuć system zarządzania pakietami.

Zobacz nową „odpowiedź na rok 2020”, aby zapoznać się z alternatywnym rozwiązaniem.

user3728501
źródło
Spędziłem godziny, próbując to rozgryźć. Ta odpowiedź zadziałała dla mnie: Ubuntu 13.04, x64. NetBeans C ++ IDE (dodaj linię konsolidatora w Project Properties-> Build-> Linker-> Libraries-> Add Option-> Other Option - w przeciwnym razie postępuj zgodnie z instrukcjami dosłownie)
Scott Drew
Najwyraźniej (z GLFW 3.0.3) coś używa, powwięc dodanie -lmdo opcji kompilacji naprawiło to.
Forest Katsch
1
Edward, dziękuję. Potrzebowałem tego sprawdzenia, czy wszystkie wymagania -l nie oznaczają tylko, że robię coś źle.
wrongu
3
koleś, jesteś pieprzonym geniuszem !!!! masz 3 godziny, ja mam 3 dni próbując to zrobić (właściwie szukam informacji od czego zacząć, czytać o historii nadprzyrodzonej diety i tak dalej) dziękuję ci bardzo cholernie bardzo; Chciałbym również poradzić, że przeczytałem stronę glfw, nie mogłem wykonać pracy po ich samouczku, prawie się poddawałem, kiedy to znalazłem, a oni nie wyjaśniają tak prosto i bezpośrednio jak ty. świetna robota, którą tu wykonałeś !!
Victor R. Oliveira
1
Na czystej Linux Mint musiałem zainstalować następujące pakiety:sudo apt-get update && sudo apt-get install build-essential libevent-pthreads-2.0.5 doxygen xorg-dev libglu1-mesa-dev
Lenar Hoyt
18

Rozwiązałem to w ten sposób

Plik pkg-config zawiera opis wszystkich niezbędnych flag i zależności czasu kompilacji i linkowania oraz zależności potrzebnych do korzystania z biblioteki.

pkg-config --static --libs glfw3

pokazuje mi to

-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  

Nie wiem, czy wszystkie te biblioteki są rzeczywiście potrzebne do kompilacji, ale dla mnie działa ...

Oleh Pomazan
źródło
3
Ta odpowiedź jest koniecznością. Nie wiedziałem wcześniej o pkg-config. Ale od dziś będę go używać do końca, ponieważ pomoże mi to rozwiązać wszelkiego rodzaju problemy z powiązaniami. Dzięki za tak niesamowitą odpowiedź.
Sayan Bhattacharjee
18

Zauważ, że nie potrzebujesz tak wielu -ls, jeśli zainstalujesz glfw z BUILD_SHARED_LIBSopcją. (Możesz włączyć tę opcję, uruchamiającccmake najpierw).

W ten sposób sudo make installzainstalujesz udostępnioną bibliotekę w /usr/local/lib/libglfw.so. Następnie możesz skompilować przykładowy plik za pomocą prostego:

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

Następnie nie zapomnij dodać / usr / local / lib / do ścieżki wyszukiwania bibliotek współdzielonych przed uruchomieniem programu. Można to zrobić za pomocą:

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

Możesz to umieścić w swoim, ~/.bashrcaby nie musieć wpisywać go cały czas.

CastleDefender
źródło
1
ta informacja jest naprawdę ważna dla tych, którzy chcieliby skonfigurować jedno IDE zamiast używać terminala do kompilowania i uruchamiania; Czy mógłbyś podać więcej szczegółów, jak to zrobić? Próbowałem, ale nie udało mi się
Victor R. Oliveira
Noob tutaj! Wiem, że to trochę stare, ale naprawdę mi pomogło. Czy ktoś może wyjaśnić (lub podać link do kogoś wyjaśniającego), dlaczego użycie udostępnionej biblioteki sprawi, że nie będziemy musieli łączyć wszystkich innych bibliotek, z których wiele było również udostępnianymi plikami obiektów? Musiałem także ustawić zmienną LD_LIBRARY_PATH po kompilacji lub stawić czoła gniewowi błędów GNU, gdy próbuję uruchomić mój nowo skompilowany plik wykonywalny.
Sammaron,
1
Cześć Sammaron, dziękuję za rozmowę o LD_LIBRARY_PATH, zaktualizuję moją odpowiedź, aby to uwzględnić. Powodem, dla którego nie musisz określać wszystkich innych bibliotek podczas korzystania z biblioteki glfw, jest to, że glfw już je ładuje. Możesz użyć polecenia, lddaby sprawdzić, jakie biblioteki są ładowane przez program po uruchomieniu. Jest to również dobry sposób na sprawdzenie, czy biblioteki zostały poprawnie znalezione. Możesz użyć lddw swoim programie i na /usr/local/lib/libglfw.so, aby porównać.
CastleDefender
Dziękuję za odpowiedź! Chciałem też trochę poprawić siebie: zmienna LD_LIBRARY_PATH jest realnym rozwiązaniem, ale jeśli biblioteka została zainstalowana w standardowej ścieżce, którą program ładujący i tak będzie przeszukiwał, uruchomienie sudo ldconfigpowinno rozwiązać ten problem i nie wymagać konfiguracji LD_LIBRARY_PATH każdego razu. Ta odpowiedź zawiera dyskusję, dlaczego może to być preferowane.
Sammaron
Po wykonaniu udostępnionej kompilacji musiałem skompilować / połączyć 2 inne. g ++ main.cpp -L / usr / local / lib / -lglfw -lGLU -lGL działało dla mnie.
Sridhar Thiagarajan
9

Ponieważ zaakceptowana odpowiedź nie pozwala na więcej zmian, podsumuję ją jednym poleceniem kopiuj-wklej (Zastąp 3.2.1 najnowszą wersją dostępną w pierwszym wierszu):

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

Jeśli chcesz skompilować program, użyj następujących poleceń:

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

Jeśli korzystasz z samouczka learnopengl.com, być może będziesz musiał również skonfigurować GLAD. W takim przypadku kliknij ten link

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

a następnie kliknij przycisk „Generuj” w prawym dolnym rogu witryny i pobierz plik zip. Wyodrębnij go i skompiluj źródła za pomocą następującego polecenia:

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

Teraz polecenia kompilacji programu wyglądają następująco:

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
Adrian
źródło
2
Znakomity! Pracował dla mnie na Ubuntu 16.04 z GLFW v3.2.1. Tylko dwie drobne poprawki: ustaw wersję = XXX powinno po prostu być wersja = "XXX" i nie powinno być .zip na końcu tego wiersza: cd glfw - $ {wersja} .zip
Tim
3

Zaktualizowana odpowiedź 2020

Jest rok 2020 (7 lat później) i w tym czasie dowiedziałem się więcej o Linuksie. Szczególnie, że uruchamianie sudo make installpodczas instalowania bibliotek może nie być dobrym pomysłem , ponieważ mogą one zakłócać system zarządzania pakietami. (W tym przypadkuapt ponieważ używam Debiana 10.)

Jeśli to nie jest poprawne, popraw mnie w komentarzach.

Alternatywne proponowane rozwiązanie

Te informacje pochodzą z dokumentacji GLFW, jednak rozszerzyłem / usprawniłem informacje, które są istotne dla użytkowników Linuksa.

  • Przejdź do katalogu domowego i sklonuj repozytorium glfw z github
cd ~
git clone https://github.com/glfw/glfw.git
cd glfw
  • Możesz w tym momencie utworzyć katalog kompilacji i postępować zgodnie z instrukcjami tutaj ( instrukcje budowania glfw ), jednak zdecydowałem się tego nie robić. Następujące polecenie nadal wydaje się działać w 2020 r., Ale nie jest to wyraźnie określone w instrukcjach online glfw.
cmake -G "Unix Makefiles"
  • Być może będziesz musiał uciekać sudo apt-get build-dep glfw3 przed (?). Uruchomiłem zarówno to polecenie, sudo apt install xorg-devjak i zgodnie z instrukcją.

  • Wreszcie biegnij make

  • Teraz w katalogu projektu wykonaj następujące czynności. (Przejdź do swojego projektu, który używa bibliotek glfw)

  • Utwórz CMakeLists.txt, mój wygląda tak

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)
  • Jeśli nie lubisz CMake, przepraszam, ale moim zdaniem jest to najłatwiejszy sposób na szybkie uruchomienie projektu. Poleciłbym nauczyć się go używać, przynajmniej na podstawowym poziomie. Niestety nie znam żadnego dobrego tutoriala o CMake

  • Następnie zrób cmake .imake , Twój projekt powinien zostać skompilowany i połączony z biblioteką współdzieloną glfw3

  • Istnieje pewien sposób tworzenia dynamicznie połączonej biblioteki. Wydaje mi się, że użyłem tutaj metody statycznej. Proszę skomentuj / dodaj sekcję w tej odpowiedzi poniżej, jeśli wiesz więcej niż ja

  • To powinno działać na innych systemach, jeśli nie, daj mi znać, a pomogę, jeśli będę mógł

user3728501
źródło
2

Świetny przewodnik, dziękuję. Biorąc pod uwagę większość instrukcji tutaj, prawie zbudowano go dla mnie, ale pozostał jeden błąd.

/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

Po wyszukaniu tego błędu musiałem dopisać -ldldo linii poleceń.

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

Następnie skompilowano i połączono przykładową aplikację „hello GLFW”.

Jestem całkiem nowy w Linuksie, więc nie jestem do końca pewien, co dokładnie robi ta dodatkowa biblioteka ... poza naprawą błędu łączenia. Widzę jednak ten przełącznik linii cmd w powyższym poście.

user2941878
źródło
Mam plik .o i .exec .. pomóż mi, jak to uruchomić?
Buddhika Chaturanga
0

Jeśli ktoś robi się leniwy i być może nie wie, jak skonfigurować powłokę dla wszystkich tych bibliotek i -l s, to stworzyłem skrypt w Pythonie (musisz mieć python3, większość użytkowników linuxa go ma), który pozwala łatwo skompilować skrypty i uruchamiać je bez większych zmartwień, po prostu ma regularne wywołania systemowe, po prostu starannie ułożone, stworzyłem to dla siebie, ale może by się przydałoby: oto jest

matematyka
źródło
0

Dobrze opisana odpowiedź już tam jest, ale przeszedłem przez ten KRÓTSZY przepis:

  1. Zainstaluj Linuxbrew
  2. $ brew install glfw
  3. cd /home/linuxbrew/.linuxbrew/Cellar/glfw/X.X/include
  4. sudo cp -R GLFW /usr/include

Wyjaśnienie: Udało nam się zbudować GLFW przez CMAKE, co jest robione przez Linuxbrew (port Linux ukochanego Homebrew). Następnie skopiuj pliki nagłówkowe do miejsca, z którego Linux czyta ( /usr/include).

Shayan Amani
źródło