So erstellen und installieren Sie GLFW 3 und verwenden es in einem Linux-Projekt


95

GLFW3

Letzte Nacht habe ich spät gearbeitet und versucht, die GLFW 3-Pakete für Linux aus dem Quellcode zu erstellen. Dieser Prozess hat sehr lange gedauert, insgesamt etwa 3 Stunden, teils weil ich mit CMake nicht vertraut bin, teils weil ich mit GLFW nicht vertraut bin.

Ich hoffe, dass dieser Beitrag Sie vor den Schwierigkeiten bewahren wird, die ich gestern hatte! Ich dachte, ich sollte einen kurzen Bericht schreiben und dir hoffentlich einige Stunden deines Lebens ersparen ...

Dank "urraka", "b6" und "niklas" auf dem # glfw IRC-Kanal konnte ich glfw Version 3.0.1 zum Laufen bringen.

Es stellt sich heraus, dass dies kein trivialer Prozess ist (sicherlich nicht für mich, ich bin kein Experte), da es im Web nicht viel Dokumentation über glfw3 gibt, insbesondere über das Einrichten mit CMake.

Ich wurde gebeten, dies in einen Frage- und Antwortabschnitt aufzuteilen, und so habe ich das getan, und die Antwortteile sind jetzt unten.

Sind Sie ein Betreuer von GLFW oder ein Mitglied des GLFW-Teams?

Wenn einer der Betreuer von GLFW3 dies sieht, ist meine Nachricht an sie bitte, Ihrer Website einen Abschnitt "Einrichten von GLFW3 unter Windows, Mac OS X und Linux" hinzuzufügen! Es ist ziemlich einfach, Programme mit GLFW zu schreiben, da die Online-Dokumentation ziemlich gut ist, ein schneller Scan aller verfügbaren Klassen und Module und Sie können loslegen. Das Beispiel eines hier vorgestellten Testprojekts ist ebenfalls sehr gut. Die beiden Hauptprobleme, die ich gefunden habe, waren: Erstens, wie richte ich GLFW3 auf meinem System ein und zweitens, wie erstelle ich ein GLFW3-Projekt? Diese beiden Dinge sind für einen Nicht-Experten vielleicht nicht klar genug.

Bearbeiten

Habe heute einen kurzen Blick darauf geworfen (Datum: 2014-01-14), es sieht so aus, als ob die GLFW-Website seit meinem letzten Besuch starke Änderungen erfahren hat, und es gibt jetzt einen Abschnitt über das Kompilieren von GLFW- und Buliding-Programmen mit GLFW, die ich für neu halte.


Vielen Dank, dass Sie dies hier veröffentlicht haben - offensichtlich wurde viel Arbeit investiert. Würde es Ihnen etwas ausmachen, es in eine Frage und Antwort aufzuteilen? Sie können Ihre eigene Antwort auf Ihre eigene Frage hinzufügen und als richtig markieren.
Fraser

@Fraser Ja natürlich, wenn Sie denken, es wäre besser so
user3728501

1
Ich stimme dem zu. Ich mag GLFW sehr, war aber sehr frustriert, keine Dokumentation zum Kompilieren von v3 unter Mac usw. zu finden
user18490

1
@ user18490 Ja, ich fand das überraschend, da GLFW "eine bessere Flut" zu sein scheint. Ich bin sicher, dass sie in ihrer Dokumentation erwähnt haben, dass Überfluss nur zum Lernen gut ist. Wenn Sie eine professionelle Fensterbibliothek wünschen, verwenden Sie GLFW. Das Überraschende ist also, dass sie Ihnen sagen, wie gut es ist, aber nicht, wie Sie es installieren sollen! (Ganz anders als SFML)
user3728501

@ Edward Bird. Ich habe auf dieser Webseite endlich einige nützliche Informationen zur Installation von GLFW gefunden: Scratchapixel.com/lessons/3d-basic-lessons/lesson-2-get-started/…
user18490

Antworten:


125

Schritt 1: Installieren von GLFW 3 auf Ihrem System mit CMAKE

Für diese Installation habe ich KUbuntu 13.04, 64bit verwendet.

Der erste Schritt besteht darin, die neueste Version (unter der Annahme, dass zukünftige Versionen auf ähnliche Weise funktionieren ) von www.glfw.org herunterzuladen , wahrscheinlich über diesen Link .

Der nächste Schritt besteht darin, das Archiv zu extrahieren und ein Terminal zu öffnen. cdWenn cmake -G "Unix Makefiles"Sie in das Verzeichnis glfw-3.XX wechseln und es ausführen , benötigen Sie möglicherweise erhöhte Berechtigungen. Außerdem müssen Sie möglicherweise zuerst Build-Abhängigkeiten installieren . Um dies zu tun, versuchen sudo apt-get build-dep glfw oder sudo apt-get build-dep glfw3 oder es manuell tun , wie ich mit tat sudo apt-get install cmake xorg-dev libglu1-mesa-dev... Es können auch andere Libs Ihnen wie die pthread Bibliotheken erfordern ... Anscheinend schon , sie hatte ich. (Siehe die -l-Optionen für die g ++ - Linkerstufe unten.)

Jetzt können Sie tippen makeund dann make install, was wahrscheinlich erfordert, dass Sie sudozuerst.

Okay, Sie sollten in den letzten drei CMake-Stufen eine ausführliche Ausgabe erhalten, die Ihnen sagt, was gebaut wurde oder wo es platziert wurde. (In /usr/includezum Beispiel.)

Schritt 2: Erstellen Sie ein Testprogramm und kompilieren Sie

Der nächste Schritt ist das Starten von vim ("was?! Vim?!", Sagen Sie) oder Ihres bevorzugten IDE- / Texteditors ... Ich habe vim nicht verwendet, ich habe Kate verwendet, weil ich auf KUbuntu 13.04 bin ... Laden Sie das Testprogramm von hier (unten auf der Seite) herunter oder kopieren Sie es und speichern Sie es.

Jetzt kompilieren mit g++ -std=c++11 -c main.cpp- nicht sicher, ob c ++ 11 erforderlich ist , aber ich habe es verwendet nullptr, ich brauchte es ... Möglicherweise müssen Sie Ihr gcc auf Version 4.7 oder die kommende Version 4.8 aktualisieren ... Infos dazu hier .

Beheben Sie dann Ihre Fehler, wenn Sie das Programm von Hand eingegeben oder versucht haben, "zu schlau" zu sein und etwas nicht funktioniert hat ... Dann verknüpfen Sie es mit diesem Monster! g++ main.o -o main.exec -lGL -lGLU -lglfw3 -lX11 -lXxf86vm -lXrandr -lpthread -lXiSie sehen also, in dem „Build - Abhängigkeiten installieren“ Teil, können Sie auch haben Sie überprüfen die GL, GLU, X11 Xxf86vm (was immer das ist) Xrandr posix-Thread und Xi (was immer das ist) Entwicklung Bibliotheken installiert. Vielleicht aktualisieren Sie auch Ihre Grafiktreiber. Ich denke, GLFW 3 erfordert möglicherweise OpenGL Version 3 oder höher? Vielleicht kann jemand das bestätigen? Möglicherweise müssen Sie auch die Linker-Optionen hinzufügen -ldl -lXinerama -lXcursor, damit sie ordnungsgemäß funktionieren, wenn Sie undefinierte Verweise auf erhalten dlclose(Gutschrift an @ user2255242).

Und ja, ich brauchte wirklich so viele -l!

Schritt 3: Sie sind fertig, einen schönen Tag!

Hoffentlich waren diese Informationen korrekt und alles hat für Sie funktioniert, und Sie haben es genossen, das GLFW-Testprogramm zu schreiben. Auch hoffentlich diese Leitfaden haben dazu beigetragen, oder helfen, ein paar Leute in der Zukunft, die , wie ich rangen waren heute gestern!

Übrigens sind alle Tags die Dinge, nach denen ich im Stackoverflow gesucht habe, um nach einer Antwort zu suchen, die es nicht gab. (Bis jetzt.) Hoffentlich sind sie das, wonach Sie gesucht haben, wenn Sie sich in einer ähnlichen Position wie ich befanden.

Anmerkung des Autors:

Dies ist möglicherweise keine gute Idee. Diese Methode (mit sudo make install) kann für Ihr System gefährlich sein. (Siehe Don't Break Debian)

Im Idealfall sollte ich oder jemand anderes eine Lösung vorschlagen, die nicht nur lib-Dateien usw. in den Standardverzeichnissen des Systems installiert, da diese von Paketmanagern wie verwaltet werden sollten. Dies aptkann zu Konflikten führen und Ihr Paketverwaltungssystem beschädigen.

In der neuen Antwort "2020" finden Sie eine alternative Lösung.


Ich habe stundenlang versucht, das herauszufinden. Diese Antwort hat bei mir funktioniert: Ubuntu 13.04, x64. NetBeans C ++ IDE (fügen Sie die Linkerzeile in Projekteigenschaften-> Erstellen-> Linker-> Bibliotheken-> Option hinzufügen-> Andere Option hinzu - ansonsten folgen Sie den Anweisungen wörtlich)
Scott Drew

Anscheinend (mit GLFW 3.0.3) wird etwas verwendet pow, das durch Hinzufügen -lmzu den Kompilierungsoptionen behoben wurde.
Forest Katsch

1
Edward, danke. Ich brauchte diesen Sanity-Check, bei dem alle Anforderungen nicht nur bedeuteten, dass ich etwas falsch gemacht hatte.
Falsch

3
Alter, du bist ein Fu **** GENIE !!!! Du hast 3 Stunden Zeit, ich habe 3 Tage Zeit, um dies zu tun (tatsächlich nachzuforschen, wo ich anfangen soll, über die Geschichte der Überflutung zu lesen und so weiter). Danke, vielen Dank. Ich möchte auch raten, dass ich die glfw-Seite gelesen habe, den Job nach ihrem Tutorial nicht machen konnte, fast aufgab, als ich das fand und sie nicht so einfach und direkt erklären wie Sie. tolle Arbeit, die du hier gemacht hast !!
Victor R. Oliveira

1
Auf einer sauberen Linux Mint musste ich folgende Pakete installieren:sudo apt-get update && sudo apt-get install build-essential libevent-pthreads-2.0.5 doxygen xorg-dev libglu1-mesa-dev
Lenar Hoyt

18

Ich habe es auf diese Weise gelöst

Eine pkg-config-Datei beschreibt alle erforderlichen Flags und Abhängigkeiten zur Kompilierungs- und Verknüpfungszeit, die zur Verwendung einer Bibliothek erforderlich sind.

pkg-config --static --libs glfw3

zeigt mir das

-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  

Ich weiß nicht, ob all diese Bibliotheken tatsächlich zum Kompilieren notwendig sind, aber für mich funktioniert es ...


3
Diese Antwort ist ein Muss. Ich wusste vorher nichts über pkg-config. Aber von heute an werde ich es bis zum Ende verwenden, weil es mir helfen wird, jede Art von Verbindungsabhängigkeitsproblem zu lösen. Vielen Dank für diese tolle Antwort.
Sayan Bhattacharjee

18

Beachten Sie, dass Sie nicht so viele -ls benötigen, wenn Sie glfw mit der BUILD_SHARED_LIBSOption installieren . (Sie können diese Option aktivieren, indem Sie sie ccmakezuerst ausführen.)

Auf diese Weise sudo make installwird die gemeinsam genutzte Bibliothek in installiert /usr/local/lib/libglfw.so. Sie können die Beispieldatei dann mit einem einfachen Beispiel kompilieren:

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

Vergessen Sie dann nicht, / usr / local / lib / zum Suchpfad für gemeinsam genutzte Bibliotheken hinzuzufügen, bevor Sie Ihr Programm ausführen. Dies kann erfolgen mit:

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

Und Sie können das in Ihr eingeben, ~/.bashrcdamit Sie es nicht die ganze Zeit eingeben müssen.


1
Diese Informationen sind wirklich wichtig für diejenigen, die eine IDE einrichten möchten, anstatt das Terminal zum Kompilieren und Ausführen zu verwenden. Könnten Sie weitere Einzelheiten dazu angeben? Ich habe es versucht, aber überhaupt nicht erfolgreich
Victor R. Oliveira

Noob hier! Ich weiß, das ist ein bisschen alt, aber es hat mir wirklich geholfen. Kann jemand erklären (oder mit jemandem verknüpfen, der erklärt), warum die Verwendung einer gemeinsam genutzten Bibliothek dazu führen würde, dass nicht alle anderen Bibliotheken verknüpft werden müssen, von denen viele auch gemeinsam genutzte Objektdateien waren? Außerdem musste ich die Variable LD_LIBRARY_PATH nach dem Kompilieren festlegen oder mich dem Zorn von Gnu-Fehlern stellen, wenn ich versuche, meine neu kompilierte ausführbare Datei auszuführen.
Sammaron

1
Hallo Sammaron, danke, dass du über LD_LIBRARY_PATH gesprochen hast. Ich werde meine Antwort aktualisieren, um dies aufzunehmen. Der Grund, warum Sie bei Verwendung der glfw-Bibliothek nicht alle anderen Bibliotheken angeben müssen, ist, dass glfw sie bereits lädt. Mit dem Befehl können Sie lddüberprüfen, welche Bibliotheken von einem Programm geladen werden, wenn es ausgeführt wird. Dies ist auch eine gute Möglichkeit, um zu überprüfen, ob die Bibliotheken ordnungsgemäß gefunden wurden. Sie können lddin Ihrem Programm und auf /usr/local/lib/libglfw.so vergleichen.
CastleDefender

Danke für die Antwort! Außerdem wollte ich mich ein wenig korrigieren: Die Variable LD_LIBRARY_PATH ist eine praktikable Lösung. Wenn die Bibliothek jedoch im Standardpfad installiert wurde, nach dem der Loader trotzdem sucht, sudo ldconfigsollte die Ausführung dieses Problem lösen und keine Konfiguration von LD_LIBRARY_PATH erfordern jedes Mal. Diese Antwort enthält eine Diskussion darüber, warum dies bevorzugt werden könnte.
Sammaron

Nachdem ich mit Build Shared gearbeitet hatte, musste ich 2 andere kompilieren / verknüpfen. g ++ main.cpp -L / usr / local / lib / -lglfw -lGLU -lGL hat bei mir funktioniert.
Sridhar Thiagarajan

9

Da die akzeptierte Antwort keine weiteren Änderungen zulässt, werde ich sie mit einem einzigen Befehl zum Kopieren und Einfügen zusammenfassen (Ersetzen Sie 3.2.1 durch die neueste Version in der ersten Zeile):

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

Wenn Sie ein Programm kompilieren möchten, verwenden Sie die folgenden Befehle:

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

Wenn Sie dem Lernprogramm von learnopengl.com folgen, müssen Sie möglicherweise auch GLAD einrichten. In diesem Fall klicken Sie auf diesen 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

Klicken Sie anschließend auf die Schaltfläche "Generieren" in der unteren rechten Ecke der Website und laden Sie die Zip-Datei herunter. Extrahieren Sie es und kompilieren Sie die Quellen mit dem folgenden Befehl:

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

Die Befehle zum Kompilieren Ihres Programms lauten nun wie folgt:

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
Brillant! Arbeitete für mich unter Ubuntu 16.04 mit GLFW v3.2.1. Nur zwei kleinere Korrekturen: set version = XXX sollte einfach version = "XXX" sein und am Ende dieser Zeile sollte sich kein .zip befinden: cd glfw - $ {version} .zip
Tim

2

Toller Führer, danke. Angesichts der meisten Anweisungen hier wurde es fast für mich gebaut, aber ich hatte noch einen Fehler.

/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

Nachdem ich nach diesem Fehler gesucht hatte, musste ich ihn zur -ldlBefehlszeile hinzufügen .

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

Dann wurde die Beispiel-App "Hallo GLFW" kompiliert und verlinkt.

Ich bin ziemlich neu in Linux, daher bin ich mir nicht ganz sicher, was genau diese zusätzliche Bibliothek tut ... außer meinen Verknüpfungsfehler zu beheben. Ich sehe diesen cmd-Zeilenschalter jedoch im obigen Beitrag.


Ich habe .o und .exec Datei .. bitte helfen Sie mir, wie man es ausführt?
Buddhika Chaturanga

0

Wenn jemand faul wird und vielleicht nicht weiß, wie man die Shell für all diese Bibliotheken und -l s konfiguriert , habe ich ein Python-Skript erstellt (Sie müssen Python3 haben, die meisten Linux-Benutzer haben es.), Mit dem Sie einfach kompilieren können Skripte und führen sie ohne große Sorgen aus, es hat nur regelmäßige Systemaufrufe, nur ordentlich angeordnet, ich habe es für mich selbst erstellt, aber vielleicht wäre es nützlich: Hier ist es


0

Die gut beschriebene Antwort ist bereits da, aber ich habe dieses KURZE Rezept durchlaufen :

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

Erläuterung: Wir schaffen es, GLFW von CMAKE zu erstellen, was von Linuxbrew (Linux-Port des geliebten Homebrew) durchgeführt wird. Kopieren Sie dann die Header-Dateien an die Stelle, an der Linux von ( /usr/include) liest .


0

2020 Aktualisierte Antwort

Es ist 2020 (7 Jahre später) und ich habe in dieser Zeit mehr über Linux gelernt. Insbesondere ist es möglicherweise keine gute Idee, diese sudo make installbei der Installation von Bibliotheken auszuführen , da diese das Paketverwaltungssystem beeinträchtigen können. (In diesem Fall verwende aptich Debian 10.)

Wenn dies nicht korrekt ist, korrigieren Sie mich bitte in den Kommentaren.

Alternative vorgeschlagene Lösung

Diese Informationen stammen aus den GLFW-Dokumenten. Ich habe jedoch die Informationen erweitert / optimiert, die für Linux-Benutzer relevant sind.

  • Gehen Sie zum Home-Verzeichnis und klonen Sie das glfw-Repository von github
cd ~
git clone https://github.com/glfw/glfw.git
cd glfw
  • Sie können an dieser Stelle ein Build-Verzeichnis erstellen und den Anweisungen hier folgen ( glfw-Build-Anweisungen ). Ich habe mich jedoch dagegen entschieden. Der folgende Befehl scheint im Jahr 2020 noch zu funktionieren, wird jedoch in den glfw-Online-Anweisungen nicht ausdrücklich angegeben.
cmake -G "Unix Makefiles"
  • Möglicherweise müssen Sie sudo apt-get build-dep glfw3vor (?) Ausführen . Ich habe sowohl diesen Befehl sudo apt install xorg-devals auch die Anweisungen ausgeführt.

  • Endlich laufen make

  • Gehen Sie nun in Ihrem Projektverzeichnis wie folgt vor. (Gehen Sie zu Ihrem Projekt, das die glfw-Bibliotheken verwendet.)

  • Erstellen Sie eine CMakeLists.txt, meine sieht so aus

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)
  • Wenn Sie CMake nicht mögen, entschuldige ich mich, aber meiner Meinung nach ist dies der einfachste Weg, um Ihr Projekt schnell zum Laufen zu bringen. Ich würde empfehlen, zu lernen, es zu benutzen, zumindest auf einem Grundniveau. Leider kenne ich kein gutes CMake-Tutorial

  • Dann tun Sie cmake .und make, Ihr Projekt sollte erstellt und mit glfw3 shared lib verknüpft werden

  • Es gibt eine Möglichkeit, eine dynamisch verknüpfte Bibliothek zu erstellen. Ich glaube, ich habe hier die statische Methode angewendet. Bitte kommentieren / fügen Sie einen Abschnitt in dieser Antwort unten hinzu, wenn Sie mehr wissen als ich

  • Dies sollte auf anderen Systemen funktionieren, wenn nicht, lassen Sie es mich wissen und ich werde helfen, wenn ich dazu in der Lage bin

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.