Come costruire e installare GLFW 3 e usarlo in un progetto Linux


95

GLFW3

La scorsa notte stavo lavorando fino a tardi cercando di creare i pacchetti GLFW 3 per Linux dai sorgenti. Questo processo mi ha richiesto molto tempo, circa 3 ore in totale, in parte perché non ho familiarità con CMake e in parte perché non conoscevo GLFW.

Spero che questo post ti salverà dalle difficoltà che ho avuto ieri! Ho pensato di dover scrivere un breve resoconto e, si spera, di salvarti diverse ore della tua vita ...

Grazie a "urraka", "b6" e "niklas" sul canale IRC #glfw, sono riuscito a far funzionare glfw versione 3.0.1.

Si scopre che questo non è un processo banale (certamente non per me, non sono un esperto) in quanto non c'è molta documentazione sul web su glfw3, in particolare sulla sua configurazione con CMake.

Mi è stato chiesto di dividerlo in una sezione di domande e risposte, quindi l'ho fatto e le parti di risposta sono ora di seguito.

Sei un manutentore di GLFW o un membro del team GLFW?

Se qualcuno dei manutentori di GLFW3 lo vede, il mio messaggio è per favore di aggiungere una sezione "configurazione di GLFW3 su Windows, Mac OS X e Linux" al tuo sito web! È abbastanza facile scrivere programmi con GLFW, poiché la documentazione in linea è abbastanza buona, una rapida scansione di tutte le classi e moduli disponibili e sarai pronto per partire. Anche l'esempio di un progetto di prova qui presentato è molto buono. I due problemi principali che ho riscontrato sono stati, in primo luogo come si configura GLFW3 sul mio sistema e in secondo luogo come si costruisce un progetto GLFW3? Queste due cose forse non sono abbastanza chiare per un non esperto.

modificare

Ho dato una breve occhiata oggi (Data: 2014-01-14) sembra che il sito web GLFW abbia subito pesanti cambiamenti dall'ultima volta che l'ho guardato e ora c'è una sezione sulla compilazione di GLFW e sui programmi di buliding con GLFW, che penso siano nuovi.


Grazie per averlo messo qui - ovviamente è stato fatto molto lavoro. Ti dispiacerebbe dividerlo in una domanda e risposta però? Puoi aggiungere la tua risposta alla tua domanda e contrassegnarla come corretta.
Fraser

@Fraser Sì, certo, se pensi che sarebbe meglio così
user3728501

1
Sono d'accordo con questo. Mi piace molto GLFW ma è stato davvero frustrante non trovare alcuna documentazione su come compilare la v3 su Mac, ecc.
user18490

1
@ user18490 Sì, ho trovato questo tipo di sorpresa, dal momento che GLFW sembra essere "un eccesso migliore". Sono sicuro che hanno menzionato nella loro documentazione che l'eccesso è buono solo per l'apprendimento e se vuoi una libreria per finestre professionale, usa GLFW. Quindi la cosa sorprendente è che ti dicono quanto è buono ma non ti dicono come installarlo! (A differenza di SFML)
utente3728501

@ Edward Bird. Ho finalmente trovato alcune informazioni utili su questo Web per quanto riguarda l'installazione di GLFW: scratchapixel.com/lessons/3d-basic-lessons/lesson-2-get-started/...
user18490

Risposte:


125

Passaggio 1: installazione di GLFW 3 sul sistema con CMAKE

Per questa installazione, stavo usando KUbuntu 13.04, 64 bit.

Il primo passo è scaricare l'ultima versione (assumendo che in futuro le versioni funzionino in modo simile) da www.glfw.org , probabilmente usando questo collegamento .

Il prossimo passo è estrarre l'archivio e aprire un terminale. cdnella directory glfw-3.XX ed eseguire cmake -G "Unix Makefiles"potresti aver bisogno di privilegi elevati e potresti anche aver bisogno di installare prima le dipendenze di build . Per fare questo, provare sudo apt-get build-dep glfw o sudo apt-get build-dep glfw3 o farlo manualmente , come ho fatto con sudo apt-get install cmake xorg-dev libglu1-mesa-dev... Ci possono essere altre librerie si richiedono, come le librerie di pthread ... A quanto pare li avevo già. (Vedi le opzioni -l fornite allo stage g ++ linker, di seguito.)

Ora puoi digitare makee poi make install, cosa che probabilmente richiederà sudoprima.

Va bene, dovresti ottenere un output dettagliato sulle ultime tre fasi di CMake, che ti dice cosa è stato costruito o dove è stato posizionato. (In /usr/include, per esempio.)

Passaggio 2: creare un programma di test e compilare

Il passo successivo è avviare vim ("cosa ?! vim ?!" dici) o il tuo IDE / editor di testo preferito ... Non ho usato vim, ho usato Kate, perché sono su KUbuntu 13.04 ... Ad ogni modo, scarica o copia il programma di test da qui (in fondo alla pagina) e salva, esci.

Ora compila usando g++ -std=c++11 -c main.cpp- non sono sicuro se c ++ 11 sia richiesto ma l'ho usato nullptrcosì, ne avevo bisogno ... Potrebbe essere necessario aggiornare il tuo gcc alla versione 4.7, o alla prossima versione 4.8 ... Informazioni su questo qui .

Quindi correggi i tuoi errori se hai digitato il programma a mano o hai cercato di essere "troppo intelligente" e qualcosa non ha funzionato ... Quindi collegalo usando questo mostro! g++ main.o -o main.exec -lGL -lGLU -lglfw3 -lX11 -lXxf86vm -lXrandr -lpthread -lXiQuindi vedi, nella parte "installa le dipendenze di compilazione", potresti anche voler controllare di avere le librerie di sviluppo GL, GLU, X11 Xxf86vm (qualunque essa sia) Xrandr posix-thread e Xi (qualunque essa sia) installate. Forse aggiorna anche i tuoi driver grafici, penso che GLFW 3 possa richiedere OpenGL versione 3 o successiva? Forse qualcuno può confermarlo? Potrebbe anche essere necessario aggiungere le opzioni del linker -ldl -lXinerama -lXcursorper farlo funzionare correttamente se si ottengono riferimenti indefiniti a dlclose(credito a @ user2255242).

E sì, avevo davvero bisogno di così tante -ls!

Passaggio 3: hai finito, buona giornata!

Spero che queste informazioni fossero corrette e che tutto abbia funzionato per te, e ti è piaciuto scrivere il programma di test GLFW. Si spera anche che questa guida abbia aiutato, o aiuterà, alcune persone in futuro che stavano lottando come lo ero io oggi ieri!

A proposito, tutti i tag sono le cose che ho cercato su stackoverflow alla ricerca di una risposta che non esisteva. (Fino ad ora.) Si spera che siano ciò che cercavi se fossi in una posizione simile alla mia.

Nota dell'autore:

Questa potrebbe non essere una buona idea. Questo metodo (usando sudo make install) potrebbe essere pericoloso per il tuo sistema. (Vedi Non rompere Debian)

Idealmente io, o qualcun altro, dovrei proporre una soluzione che non si limita a installare i file lib ecc. Nelle directory predefinite del sistema, poiché dovrebbero essere gestiti da gestori di pacchetti come apt, e ciò potrebbe causare un conflitto e interrompere il sistema di gestione dei pacchetti.

Vedere la nuova "risposta 2020" per una soluzione alternativa.


Ho passato ore a cercare di capirlo. Questa risposta ha funzionato per me: Ubuntu 13.04, x64. NetBeans C ++ IDE (aggiungi la riga del linker in Proprietà progetto-> Build-> Linker-> Librerie-> Aggiungi opzione-> Altra opzione - altrimenti segui le istruzioni alla lettera)
Scott Drew

Apparentemente (con GLFW 3.0.3) qualcosa usa powquindi l'aggiunta -lmalle opzioni di compilazione lo ha risolto.
Forest Katsch

1
Edward, grazie. Avevo bisogno di questo controllo di sanità mentale che tutti i requisiti -l non significassero solo che stavo facendo qualcosa di sbagliato.
wrongu

3
amico sei un fottuto GENIO !!!! hai 3 ore, io ho 3 giorni a provare a farlo (in realtà ricercando da dove iniziare, leggendo sulla storia dell'eccesso e così via, comunque) grazie, grazie mille; Vorrei anche avvisare che ho letto la pagina glfw, non sono riuscito a fare il lavoro seguendo il loro tutorial, stavo quasi per arrendermi quando ho trovato questo e non spiegano in modo così semplice e diretto come fai tu. lavoro fantastico che hai fatto qui !!
Victor R. Oliveira

1
Su una Linux Mint pulita ho dovuto installare questi pacchetti:sudo apt-get update && sudo apt-get install build-essential libevent-pthreads-2.0.5 doxygen xorg-dev libglu1-mesa-dev
Lenar Hoyt

18

L'ho risolto in questo modo

Un file pkg-config descrive tutti i flag e le dipendenze in fase di compilazione e di collegamento necessari per utilizzare una libreria.

pkg-config --static --libs glfw3

me lo mostra

-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  

Non so se tutte queste librerie siano effettivamente necessarie per la compilazione ma per me funziona ...


3
Questa risposta è assolutamente da vedere. Non sapevo prima di pkg-config. Ma da oggi lo userò fino alla fine, perché mi aiuterà a risolvere qualsiasi tipo di problema di dipendenza dal collegamento. Grazie per questa fantastica risposta.
Sayan Bhattacharjee

18

Nota che non hai bisogno di molti -ls se installi glfw con l' BUILD_SHARED_LIBSopzione. (Puoi abilitare questa opzione eseguendo ccmakeprima).

In questo modo sudo make installinstallerà la libreria condivisa in /usr/local/lib/libglfw.so. È quindi possibile compilare il file di esempio con un semplice:

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

Quindi non dimenticare di aggiungere / usr / local / lib / al percorso di ricerca per le librerie condivise prima di eseguire il programma. Questo può essere fatto usando:

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

E puoi metterlo nel tuo in ~/.bashrcmodo da non doverlo digitare tutto il tempo.


1
questa informazione è molto importante per coloro che vorrebbero impostare un IDE invece di usare il terminale per compilare ed eseguire; Potresti fornire maggiori dettagli su come farlo? Ho provato ma non ci sono riuscito affatto
Victor R. Oliveira

Noob qui! So che è un po 'vecchio, ma mi ha davvero aiutato. Qualcuno può spiegare (o collegarsi a qualcuno che spiega) perché l'uso di una libreria condivisa lo farebbe in modo da non dover collegare tutte quelle altre librerie, molte delle quali erano anche file oggetto condivisi? Inoltre, ho dovuto impostare la variabile LD_LIBRARY_PATH dopo la compilazione, o affrontare l'ira degli errori di GNU quando provo a eseguire il mio eseguibile appena compilato.
Sammaron

1
Ciao Sammaron, grazie per aver parlato di LD_LIBRARY_PATH, aggiornerò la mia risposta per includere questo. Il motivo per cui non è necessario specificare tutte le altre librerie quando si utilizza la libreria glfw è perché glfw le carica già. È possibile utilizzare il comando lddper verificare quali librerie vengono caricate da un programma quando viene eseguito. È anche un buon modo per verificare che le librerie si trovino correttamente. Puoi usarlo lddsul tuo programma e su /usr/local/lib/libglfw.so per confrontare.
CastleDefender

Grazie per la risposta! Inoltre, volevo correggermi un po ': la variabile LD_LIBRARY_PATH è una soluzione praticabile, ma se la libreria è stata installata nel percorso standard che il caricatore cercherà comunque, l'esecuzione sudo ldconfigdovrebbe risolvere questo problema e non richiedere la configurazione di LD_LIBRARY_PATH ogni volta. Questa risposta fornisce una discussione sul motivo per cui questo potrebbe essere preferito.
Sammaron

Dopo aver fatto con build shared, ho dovuto compilare / collegare altri 2. g ++ main.cpp -L / usr / local / lib / -lglfw -lGLU -lGL ha funzionato per me.
Sridhar Thiagarajan,

9

Poiché la risposta accettata non consente ulteriori modifiche, la riassumerò con un singolo comando copia-incolla (Sostituisci 3.2.1 con l'ultima versione disponibile nella prima riga):

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

Se vuoi compilare un programma usa i seguenti comandi:

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

Se stai seguendo il tutorial di learnopengl.com potresti dover configurare anche GLAD. In tal caso, fare clic su questo collegamento

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

quindi fare clic sul pulsante "Genera" nell'angolo in basso a destra del sito Web e scaricare il file zip. Estrailo e compila i sorgenti con il seguente comando:

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

Ora, i comandi per compilare il tuo programma diventano così:

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
Brillante! Ha funzionato per me su Ubuntu 16.04 con GLFW v3.2.1. Solo due correzioni minori: set version = XXX dovrebbe essere semplicemente version = "XXX" e non dovrebbe esserci .zip alla fine di questa riga: cd glfw - $ {version} .zip
Tim

2

Ottima guida, grazie. Dato la maggior parte delle istruzioni qui, è quasi costruito per me ma ho avuto un errore rimanente.

/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

Dopo aver cercato questo errore, ho dovuto aggiungere -ldlalla riga di comando.

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

Quindi l'app di esempio "hello GLFW" è stata compilata e collegata.

Sono abbastanza nuovo su Linux quindi non sono completamente sicuro di cosa faccia esattamente questa libreria extra ... oltre a correggere il mio errore di collegamento. Tuttavia, vedo quell'interruttore di linea cmd nel post sopra.


Ho i file .o e .exec .. per favore aiutami, come eseguirlo?
Buddhika Chaturanga

0

Se qualcuno sta diventando pigro e forse forse non sa come configurare la shell per tutte quelle librerie e -l s, allora ho creato uno script python (devi avere python3, la maggior parte degli utenti linux ce l'ha) che ti permette di compilare facilmente script ed eseguirli senza preoccuparsi troppo, ha solo chiamate di sistema regolari, solo organizzate in modo ordinato, l'ho creato per me stesso ma forse sarebbe utile: eccolo


0

La risposta ben descritta è già lì, ma ho seguito questa ricetta PIÙ BREVE :

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

Spiegazione: riusciamo a compilare GLFW da CMAKE che è fatto da Linuxbrew (il port su Linux dell'amato Homebrew). Quindi copia i file di intestazione in cui Linux legge da ( /usr/include).


0

Risposta aggiornata del 2020

È il 2020 (7 anni dopo) e in questo periodo ho imparato di più su Linux. In particolare, potrebbe non essere una buona idea eseguirla sudo make installdurante l'installazione delle librerie, poiché potrebbero interferire con il sistema di gestione dei pacchetti. (In questo caso, aptpoiché sto usando Debian 10.)

Se questo non è corretto, correggimi nei commenti.

Soluzione proposta alternativa

Queste informazioni sono prese dai documenti GLFW, tuttavia ho ampliato / ottimizzato le informazioni rilevanti per gli utenti Linux.

  • Vai alla home directory e clona il repository glfw da GitHub
cd ~
git clone https://github.com/glfw/glfw.git
cd glfw
  • A questo punto puoi creare una directory di build e seguire le istruzioni qui ( istruzioni di build glfw ), tuttavia ho scelto di non farlo. Il seguente comando sembra ancora funzionare nel 2020, tuttavia non è esplicitamente dichiarato dalle istruzioni online glfw.
cmake -G "Unix Makefiles"
  • Potrebbe essere necessario eseguire sudo apt-get build-dep glfw3prima (?). Ho eseguito sia questo comando sudo apt install xorg-devche secondo le istruzioni.

  • Finalmente corri make

  • Ora nella directory del tuo progetto, fai quanto segue. (Vai al tuo progetto che usa le librerie glfw)

  • Crea un CMakeLists.txt, il mio assomiglia a questo

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)
  • Se non ti piace CMake, mi scuso ma secondo me è il modo più semplice per far funzionare rapidamente il tuo progetto. Consiglierei di imparare a usarlo, almeno a un livello base. Purtroppo non conosco nessun buon tutorial su CMake

  • Quindi fai cmake .e make, il tuo progetto dovrebbe essere costruito e collegato alla libreria condivisa glfw3

  • C'è un modo per creare una libreria dinamica collegata. Credo di aver usato il metodo statico qui. Per favore commenta / aggiungi una sezione in questa risposta qui sotto se ne sai più di me

  • Questo dovrebbe funzionare su altri sistemi, altrimenti fammelo sapere e ti aiuterò se sarò in grado di farlo

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.