Comment construire et installer GLFW 3 et l'utiliser dans un projet Linux


95

GLFW3

Hier soir, je travaillais tard pour essayer de construire les packages GLFW 3 pour Linux à partir des sources. Ce processus m'a pris très longtemps, environ 3 heures au total, en partie parce que je ne suis pas familier avec CMake, et en partie parce que je ne connaissais pas GLFW.

J'espère que ce post vous sauvera de la difficulté que j'ai eue hier! J'ai pensé que je devrais faire un bref article et, espérons-le, vous sauver plusieurs heures de votre vie ...

Grâce à "urraka", "b6" et "niklas" sur le canal IRC #glfw, j'ai pu faire fonctionner la version 3.0.1 de glfw.

Il s'avère que ce n'est pas un processus trivial (certainement pas pour moi, je ne suis pas un expert) car il n'y a pas beaucoup de documentation sur le Web sur glfw3, en particulier sur sa configuration avec CMake.

On m'a demandé de diviser cela en une section de questions et réponses, et c'est ce que j'ai fait, et les parties de réponse sont maintenant ci-dessous.

Êtes-vous un mainteneur de GLFW ou un membre de l'équipe GLFW?

Si l'un des responsables de GLFW3 voit cela, alors mon message à eux est d'ajouter une section "Configuration de GLFW3 sur Windows, Mac OS X et Linux" à votre site Web! Il est assez facile d'écrire des programmes avec GLFW, car la documentation en ligne est assez bonne, une analyse rapide de toutes les classes et modules disponibles et vous serez prêt à partir. L'exemple d'un projet de test présenté ici est également très bon. Les deux principaux problèmes que j'ai trouvés étaient, premièrement, comment configurer GLFW3 sur mon système, et deuxièmement, comment créer un projet GLFW3? Ces deux choses ne sont peut-être pas assez claires pour un non-expert.

Éditer

J'ai jeté un bref coup d'œil aujourd'hui (Date: 2014-01-14), il semble que le site Web de GLFW a subi de profonds changements depuis ma dernière consultation et il y a maintenant une section sur la compilation de GLFW et la construction de programmes avec GLFW, qui je pense sont nouvelles.


Merci d'avoir mis cela ici - il y a évidemment beaucoup de travail. Cela vous dérangerait-il de le diviser en une question et une réponse? Vous pouvez ajouter votre propre réponse à votre propre question et la marquer comme correcte.
Fraser

@Fraser Oui bien sûr si vous pensez que ce serait mieux comme ça
user3728501

1
Je suis d'accord. J'aime beaucoup GLFW mais j'étais vraiment frustré de ne trouver aucune documentation sur la façon de compiler la v3 sous Mac, etc.
user18490

1
@ user18490 Oui, j'ai trouvé ce genre de surprise, puisque GLFW semble être "une meilleure surabondance". Je suis sûr qu'ils ont mentionné dans leur documentation que la surabondance n'est bonne que pour l'apprentissage et si vous voulez une bibliothèque de fenêtres professionnelle, utilisez GLFW. Donc, la chose surprenante est qu'ils vous disent à quel point c'est bon mais ne vous disent pas comment l'installer! (Tout à fait contrairement à SFML)
user3728501

@Edward Bird. J'ai finalement trouvé des informations utiles sur cette page Web concernant l'installation de GLFW: scratchapixel.com/lessons/3d-basic-lessons/lesson-2-get-started/…
user18490

Réponses:


125

Étape 1: Installation de GLFW 3 sur votre système avec CMAKE

Pour cette installation, j'utilisais KUbuntu 13.04, 64 bits.

La première étape consiste à télécharger la dernière version (en supposant que les versions futures fonctionnent de la même manière) à partir de www.glfw.org , probablement en utilisant ce lien .

L'étape suivante consiste à extraire l'archive et à ouvrir un terminal. cddans le répertoire glfw-3.XX et exécutez, cmake -G "Unix Makefiles"vous aurez peut-être besoin de privilèges élevés, et vous devrez peut-être également installer d'abord les dépendances de construction . Pour ce faire, essayez sudo apt-get build-dep glfw ou sudo apt-get build-dep glfw3 ou faites-le manuellement , comme je l'ai fait en utilisant sudo apt-get install cmake xorg-dev libglu1-mesa-dev... Il se peut que vous ayez besoin d'autres bibliothèques telles que les bibliothèques pthread ... Apparemment, je les avais déjà. (Voir les options -l données à l'étape de l'éditeur de liens g ++, ci-dessous.)

Vous pouvez maintenant taper makeet ensuite make install, ce qui vous obligera probablement à le faire d' sudoabord.

D'accord, vous devriez obtenir une sortie détaillée sur les trois dernières étapes de CMake, vous indiquant ce qui a été construit ou où il a été placé. (Dans /usr/include, par exemple.)

Étape 2: Créez un programme de test et compilez

L'étape suivante consiste à lancer vim ("quoi?! Vim?!" Dites-vous) ou votre éditeur de texte / IDE préféré ... Je n'ai pas utilisé vim, j'ai utilisé Kate, car je suis sur KUbuntu 13.04 ... Quoi qu'il en soit, téléchargez ou copiez le programme de test à partir d' ici (en bas de page) et enregistrez, quittez.

Maintenant, compilez en utilisant g++ -std=c++11 -c main.cpp- je ne sais pas si c ++ 11 est nécessaire mais je l'ai utilisé nullptr, j'en avais besoin ... Vous devrez peut-être mettre à jour votre gcc vers la version 4.7, ou la prochaine version 4.8 ... Info à ce sujet ici .

Ensuite, corrigez vos erreurs si vous avez tapé le programme à la main ou essayé d'être "trop ​​intelligent" et que quelque chose n'a pas fonctionné ... Puis liez-le en utilisant ce monstre! g++ main.o -o main.exec -lGL -lGLU -lglfw3 -lX11 -lXxf86vm -lXrandr -lpthread -lXiAinsi, vous voyez, dans la partie "installer les dépendances de construction", vous pouvez également vérifier que les bibliothèques de développement GL, GLU, X11 Xxf86vm (quoi que ce soit) Xrandr posix-thread et Xi (quoi que ce soit) sont également installées. Peut-être mettre à jour vos pilotes graphiques aussi, je pense que GLFW 3 peut nécessiter OpenGL version 3 ou supérieure? Peut-être que quelqu'un peut le confirmer? Vous devrez peut-être également ajouter les options -ldl -lXinerama -lXcursorde l'éditeur de liens pour le faire fonctionner correctement si vous obtenez des références non définies à dlclose(crédit à @ user2255242).

Et oui, j'en avais vraiment besoin -l!

Étape 3: Vous avez terminé, passez une bonne journée!

J'espère que ces informations étaient correctes et que tout a fonctionné pour vous, et que vous avez aimé écrire le programme de test GLFW. Espérons -le, ce guide a aidé ou aidera, quelques personnes à l'avenir qui luttaient comme je l' étais aujourd'hui hier!

Au fait, toutes les balises sont les choses que j'ai recherchées sur stackoverflow à la recherche d'une réponse qui n'existait pas. (Jusqu'à présent.) J'espère que c'est ce que vous recherchiez si vous étiez dans une situation similaire à moi.

Note de l'auteur:

Ce n'est peut-être pas une bonne idée. Cette méthode (en utilisant sudo make install) peut être dangereuse pour votre système. (Voir Don't Break Debian)

Idéalement, je devrais, ou quelqu'un d'autre, proposer une solution qui n'installe pas simplement les fichiers lib, etc. dans les répertoires par défaut du système, car ceux-ci devraient être gérés par des gestionnaires de paquets tels que apt, et cela pourrait provoquer un conflit et briser votre système de gestion de paquets.

Voir la nouvelle «réponse 2020» pour une solution alternative.


J'ai passé des heures à essayer de comprendre cela. Cette réponse a fonctionné pour moi: Ubuntu 13.04, x64. NetBeans C ++ IDE (ajoutez la ligne de l'éditeur de liens dans Propriétés du projet-> Build-> Linker-> Libraries-> Add Option-> Other Option - sinon suivez les instructions textuellement)
Scott Drew

Apparemment (avec GLFW 3.0.3) quelque chose utilise powdonc l'ajout -lmdes options de compilation l'a corrigé.
Forest Katsch

1
Edward, merci. J'avais besoin de ce contrôle de cohérence pour que toutes les exigences -l ne signifiaient pas seulement que je faisais quelque chose de mal.
Wrongu

3
mec tu es un fu **** GENIUS !!!! vous avez 3 heures, j'ai 3 jours pour essayer de le faire (en fait des recherches par où commencer, en lisant sur l'histoire de la surabondance et ainsi de suite, de toute façon) merci très fu *** beaucoup; Je voudrais également vous conseiller de lire la page glfw, de ne pas pouvoir faire le travail en suivant leur tutoriel, d'abandonner presque quand j'ai trouvé cela et ils ne l'expliquent pas aussi simple et direct que vous. travail génial que vous avez fait ici !!
Victor R. Oliveira

1
Sur un Linux Mint propre, j'ai dû installer ces paquets:sudo apt-get update && sudo apt-get install build-essential libevent-pthreads-2.0.5 doxygen xorg-dev libglu1-mesa-dev
Lenar Hoyt

18

Je l'ai résolu de cette façon

Un fichier pkg-config décrit tous les indicateurs et dépendances de compilation et de liaison nécessaires pour utiliser une bibliothèque.

pkg-config --static --libs glfw3

me montre que

-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  

Je ne sais pas si toutes ces bibliothèques sont réellement nécessaires pour la compilation mais pour moi ça marche ...


3
Cette réponse est à voir absolument. Je ne connaissais pas pkg-config plus tôt. Mais à partir d'aujourd'hui, je vais l'utiliser jusqu'à la fin, car cela m'aidera à résoudre tout type de problème de dépendance de liaison. Merci pour une réponse aussi géniale.
Sayan Bhattacharjee

18

Notez que vous n'avez pas besoin de beaucoup de -ls si vous installez glfw avec l' BUILD_SHARED_LIBSoption. (Vous pouvez activer cette option en exécutant d' ccmakeabord).

De cette façon sudo make install, la bibliothèque partagée sera installée dans /usr/local/lib/libglfw.so. Vous pouvez ensuite compiler le fichier d'exemple avec un simple:

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

N'oubliez pas d'ajouter / usr / local / lib / au chemin de recherche des bibliothèques partagées avant d'exécuter votre programme. Cela peut être fait en utilisant:

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

Et vous pouvez le mettre dans votre ~/.bashrcpour ne pas avoir à le taper tout le temps.


1
cette information est vraiment importante pour ceux qui voudraient installer un IDE au lieu d'utiliser le terminal pour compiler et exécuter; Pourriez-vous donner plus de détails sur la façon de procéder? J'ai essayé mais pas réussi du tout
Victor R. Oliveira

Noob ici! Je sais que c'est un peu vieux, mais cela m'a vraiment aidé. Quelqu'un peut-il expliquer (ou créer un lien vers quelqu'un expliquant) pourquoi l'utilisation d'une bibliothèque partagée permettrait de ne pas avoir à lier toutes ces autres bibliothèques, dont beaucoup étaient également des fichiers objets partagés? De plus, j'ai dû définir la variable LD_LIBRARY_PATH après la compilation, ou faire face à la colère des erreurs gnu lorsque j'essaye d'exécuter mon exécutable nouvellement compilé.
Sammaron

1
Salut Sammaron, merci d'avoir parlé du LD_LIBRARY_PATH, je mettrai à jour ma réponse pour l'inclure. La raison pour laquelle vous n'avez pas à spécifier toutes les autres bibliothèques lorsque vous utilisez la bibliothèque glfw est que glfw les charge déjà. Vous pouvez utiliser la commande lddpour vérifier quelles bibliothèques sont chargées par un programme lors de son exécution. C'est aussi un bon moyen de vérifier que les bibliothèques se trouvent correctement. Vous pouvez utiliser lddsur votre programme et sur /usr/local/lib/libglfw.so pour comparer.
CastleDefender

Merci pour la réponse! Aussi, je voulais me corriger un peu: la variable LD_LIBRARY_PATH est une solution viable, mais si la bibliothèque était installée dans le chemin standard que le chargeur recherchera de toute façon, l'exécution sudo ldconfigdevrait résoudre ce problème, et ne pas nécessiter la configuration de LD_LIBRARY_PATH à chaque fois. Cette réponse fournit une discussion sur les raisons pour lesquelles cela pourrait être préféré.
Sammaron

Après avoir fait avec build shared, j'ai dû compiler / lier 2 autres. g ++ main.cpp -L / usr / local / lib / -lglfw -lGLU -lGL a fonctionné pour moi.
Sridhar Thiagarajan

9

Étant donné que la réponse acceptée ne permet pas plus de modifications, je vais la résumer avec une seule commande copier-coller (remplacez 3.2.1 par la dernière version disponible dans la première ligne):

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

Si vous souhaitez compiler un programme, utilisez les commandes suivantes:

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

Si vous suivez le didacticiel learnopengl.com, vous devrez peut-être également configurer GLAD. Dans ce cas, cliquez sur ce lien

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

puis cliquez sur le bouton "Générer" dans le coin inférieur droit du site Web et téléchargez le fichier zip. Extrayez-le et compilez les sources avec la commande suivante:

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

Maintenant, les commandes pour compiler votre programme deviennent comme ceci:

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! A travaillé pour moi sur Ubuntu 16.04 avec GLFW v3.2.1. Seulement deux corrections mineures: set version = XXX devrait simplement être version = "XXX" et il ne devrait pas y avoir de .zip à la fin de cette ligne: cd glfw - $ {version} .zip
Tim

2

Grand guide, merci. Compte tenu de la plupart des instructions ici, il a presque été construit pour moi, mais il me restait une erreur.

/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

Après avoir recherché cette erreur, j'ai dû ajouter -ldlà la ligne de commande.

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

Ensuite, l'exemple d'application "hello GLFW" compilé et lié.

Je suis assez nouveau sur Linux, donc je ne suis pas complètement sûr de ce que fait exactement cette bibliothèque supplémentaire ... à part corriger mon erreur de liaison. Je vois cependant ce commutateur de ligne cmd dans le post ci-dessus.


J'ai un fichier .o et .exec .. aidez-moi s'il vous plaît, comment l'exécuter?
Buddhika Chaturanga

0

Si quelqu'un devient paresseux et ne sait peut-être pas comment configurer le shell pour toutes ces bibliothèques et -l s, alors j'ai créé un script python (vous devez avoir python3, la plupart des utilisateurs Linux l'ont.) Qui vous permet de compiler facilement et exécutez-les sans trop vous inquiéter, il a juste des appels système réguliers, juste arrangés proprement, je l'ai créé pour moi-même mais peut-être que ce serait utile: le voici


0

La réponse bien décrite est déjà là, mais j'ai parcouru cette recette PLUS COURTE :

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

Explication: Nous parvenons à construire GLFW par CMAKE qui est fait par Linuxbrew (port Linux de Homebrew bien-aimé). Copiez ensuite les fichiers d'en-tête vers l'emplacement de lecture de Linux ( /usr/include).


0

Réponse mise à jour 2020

Nous sommes en 2020 (7 ans plus tard) et j'en ai appris plus sur Linux pendant cette période. Plus précisément, ce n'est peut-être pas une bonne idée de l'exécuter sudo make installlors de l'installation des bibliothèques, car elles peuvent interférer avec le système de gestion des paquets. (Dans ce cas, aptcar j'utilise Debian 10.)

Si ce n'est pas correct, veuillez me corriger dans les commentaires.

Solution alternative proposée

Ces informations sont tirées de la documentation GLFW, mais j'ai développé / rationalisé les informations pertinentes pour les utilisateurs Linux.

  • Accédez au répertoire personnel et clonez le référentiel glfw à partir de github
cd ~
git clone https://github.com/glfw/glfw.git
cd glfw
  • Vous pouvez à ce stade créer un répertoire de construction et suivre les instructions ici ( instructions de construction glfw ), mais j'ai choisi de ne pas le faire. La commande suivante semble toujours fonctionner en 2020, mais elle n'est pas explicitement indiquée par les instructions en ligne de glfw.
cmake -G "Unix Makefiles"
  • Vous devrez peut-être exécuter sudo apt-get build-dep glfw3avant (?). J'ai exécuté à la fois cette commande et sudo apt install xorg-devselon les instructions.

  • Enfin courir make

  • Maintenant, dans votre répertoire de projet, procédez comme suit. (Allez dans votre projet qui utilise les libs glfw)

  • Créer un CMakeLists.txt, le mien ressemble à ceci

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)
  • Si vous n'aimez pas CMake, je m'en excuse, mais à mon avis, c'est le moyen le plus simple de faire fonctionner votre projet rapidement. Je recommanderais d'apprendre à l'utiliser, au moins à un niveau de base. Malheureusement, je ne connais aucun bon tutoriel CMake

  • Ensuite, faites cmake .et make, votre projet doit être construit et lié à la bibliothèque partagée glfw3

  • Il existe un moyen de créer une bibliothèque liée dynamique. Je crois avoir utilisé la méthode statique ici. Veuillez commenter / ajouter une section dans cette réponse ci-dessous si vous en savez plus que moi

  • Cela devrait fonctionner sur d'autres systèmes, sinon faites-le moi savoir et j'aiderai si je suis capable de

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.