115 votes

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

GLFW3

Hier soir, je travaillais tard en essayant de construire les packages GLFW 3 pour Linux à partir de la source. Ce processus m'a pris beaucoup de temps, 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 évitera la difficulté que j'ai eue hier! J'ai pensé que je devrais faire un petit résumé, et espérons sauver ainsi 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 (sûrement pas pour moi, je ne suis pas expert) car il n'y a pas beaucoup de documentation sur le web à propos de glfw3, en particulier sur comment le configurer avec CMake.

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

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

Si l'un des mainteneurs de GLFW3 voit ceci, mon message pour eux est s'il vous plaît ajoutez une section "configuration de GLFW3 sur Windows, Mac OS X et Linux" sur votre site web! Il est assez facile d'écrire des programmes avec GLFW, puisque 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 rencontrés étaient, d'abord comment configurer GLFW3 sur mon système, et deuxièmement comment construire un projet GLFW3? Ces deux choses ne sont peut-être pas assez claires pour un non-expert.

Éditer

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

0 votes

Merci d'avoir mis ceci ici - évidemment beaucoup de travail y a été investi. Auriez-vous l'amabilité de le diviser en question et réponse ? Vous pouvez ajouter votre propre réponse à votre propre question et la marquer comme correcte.

0 votes

@Fraser Oui bien sûr si tu penses que ce serait mieux de cette façon

1 votes

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

153voto

user3728501 Points 1345

É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 manière similaire) à partir de www.glfw.org, probablement en utilisant ce lien.

L'étape suivante consiste à extraire l'archive et ouvrir un terminal. cd dans le répertoire glfw-3.X.X et exécuter cmake -G "Unix Makefiles" vous pouvez avoir besoin de privilèges élevés, et vous pouvez également avoir besoin de installer d'abord les dépendances de développement. Pour ce faire, essayez sudo apt-get build-dep glfw ou sudo apt-get build-dep glfw3 ou faire cela 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'édition du lien g++ ci-dessous.)

Maintenant vous pouvez taper make puis make install, ce qui nécessitera probablement que vous utilisiez sudo d'abord.

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

Étape 2: Créer un programme de test et compiler

L'étape suivante consiste à ouvrir vim ("quoi ?! vim ?!" vous dites) ou votre IDE / éditeur de texte préféré... Je n'ai pas utilisé vim, j'ai utilisé Kate, car je suis sur KUbuntu 13.04... De toute façon, téléchargez ou copiez le programme de test à partir de ici (en bas de la page) et enregistrez, quittez.

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

Puis corrigez vos erreurs si vous avez tapé le programme à la main ou si vous avez essayé d'être "trop malin" 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 -lXi Donc vous voyez, dans la partie "installer les dépendances de développement", vous voudrez peut-être vérifier que vous avez également installé les bibliothèques de développement GL, GLU, X11 Xxf86vm (quoi que ce soit) Xrandr posix-thread et Xi (quoi que ce soit) aussi. 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 confirmer cela ? Vous devrez peut-être ajouter les options du lien -ldl -lXinerama -lXcursor pour que cela fonctionne correctement si vous obtenez des références non définies à dlclose (crédit à @user2255242).

Et oui, j'avais vraiment besoin de tant de -l !

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

En espérant que ces informations étaient correctes et que tout a fonctionné pour vous, et que vous avez apprécié l'écriture du programme de test GLFW. Espérons aussi que ce guide a aidé, ou aidera, quelques personnes à l'avenir qui étaient en difficulté comme je l'étais aujourd'hui hier !

Au fait, tous les balises sont les choses que j'ai cherchées sur stackoverflow en cherchant une réponse qui n'existait pas. (Jusqu'à maintenant.) Espérons qu'elles sont ce que vous avez cherché si vous étiez dans une situation similaire à la mienne.

Note d'Auteur :

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

Idéalement, moi ou quelqu'un d'autre, devrait proposer une solution qui n'installe pas simplement des fichiers de bibliothèques 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 le faire peut causer un conflit et casser votre système de gestion de paquets.

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

0 votes

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 du lien dans Propriétés du projet->Construction->Lien->Bibliothèques->Ajouter une option->Autre option - sinon suivez les instructions à la lettre)

0 votes

Apparemment (avec GLFW 3.0.3) quelque chose utilise pow donc en ajoutant -lm aux options de compilation, cela a résolu le problème.

1 votes

Edward, merci. J'avais besoin de cette vérification de bon sens que toutes les exigences -l ne signifiaient pas simplement que je faisais quelque chose de mal.

22voto

Oleh Pomazan Points 187

J'ai résolu cela de cette manière

Un fichier pkg-config décrit tous les indicateurs de compilation et d'édition de liens nécessaires, ainsi que les dépendances 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 votes

Cette réponse est un incontournable. Je ne connaissais pas pkg-config auparavant. Mais à partir d'aujourd'hui, je vais l'utiliser jusqu'au bout, car il m'aidera à résoudre tout type de problème de dépendance de liens. Merci pour une réponse aussi géniale.

20voto

CastleDefender Points 86

Notez que vous n'avez pas besoin d'autant de -l si vous installez glfw avec l'option BUILD_SHARED_LIBS. (Vous pouvez activer cette option en exécutant d'abord ccmake).

De cette manière, sudo make install installera la bibliothèque partagée dans /usr/local/lib/libglfw.so. Vous pouvez ensuite compiler le fichier d'exemple avec simplement :

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 mettre cela dans votre ~/.bashrc pour ne pas avoir à le taper tout le temps.

1 votes

Cette information est vraiment importante pour ceux qui aimeraient configurer un IDE au lieu d'utiliser le terminal pour compiler et exécuter; Pourriez-vous donner plus de détails sur la manière de faire cela? J'ai essayé mais sans succès du tout

0 votes

Débutant ici! Je sais que c'est un peu vieux, mais cela m'a vraiment aidé. Est-ce que quelqu'un pourrait expliquer (ou donner un lien vers une explication) pourquoi l'utilisation d'une bibliothèque partagée ferait en sorte que nous n'ayons pas à lier toutes ces autres bibliothèques, dont bon nombre étaient également des fichiers objet partagés? De plus, j'ai dû définir la variable LD_LIBRARY_PATH après la compilation, ou affronter la colère des erreurs gnu lorsque j'essaie d'exécuter mon exécutable nouvellement compilé.

1 votes

Salut Sammaron, merci d'avoir parlé de LD_LIBRARY_PATH, je vais mettre à jour ma réponse pour inclure cela. La raison pour laquelle vous n'avez pas à spécifier toutes les autres bibliothèques lors de l'utilisation de la bibliothèque glfw est parce que glfw les charge déjà. Vous pouvez utiliser la commande ldd pour vérifier quelles bibliothèques sont chargées par un programme lorsqu'il s'exécute. C'est également un bon moyen de vérifier que les bibliothèques sont trouvées correctement. Vous pouvez utiliser ldd sur votre programme et sur /usr/local/lib/libglfw.so pour comparer.

18voto

user3728501 Points 1345

Réponse mise à jour 2020

Nous sommes en 2020 (7 ans plus tard) et j'ai appris davantage sur Linux pendant ce temps. En particulier, il peut ne pas être une bonne idée d'exécuter sudo make install lors de l'installation de bibliothèques, car cela pourrait interférer avec le système de gestion des paquets. (Dans ce cas apt car j'utilise Debian 10.)

Si cela est incorrect, veuillez me corriger dans les commentaires.

Solution alternative proposée

Ces informations sont extraites de la documentation de GLFW, cependant j'ai élargi/synthétisé les informations pertinentes pour les utilisateurs Linux.

  • Allez dans le répertoire personnel et clonez le dépôt glfw depuis 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 compilation de glfw), cependant j'ai choisi de ne pas le faire. La commande suivante semble toujours fonctionner en 2020, cependant elle n'est pas explicitement indiquée dans les instructions en ligne de glfw.

    cmake -G "Unix Makefiles"

  • Vous devrez peut-être exécuter sudo apt-get build-dep glfw3 avant (?). J'ai exécuté à la fois cette commande et sudo apt install xorg-dev comme indiqué dans les instructions.

  • Enfin, exécutez make

  • Maintenant, dans votre répertoire de projet, faites ce qui suit. (Allez dans votre projet qui utilise les bibliothèques glfw)

  • Créez 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//glfw /home//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 alors je m'excuse mais à mon avis c'est le moyen le plus facile de faire fonctionner rapidement votre projet. Je recommande d'apprendre à l'utiliser, au moins à un niveau de base. Malheureusement, je ne connais pas de bon tutoriel sur CMake

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

  • Il y a une manière de créer une bibliothèque liée dynamiquement. 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 je vous aiderai si je le peux

1 votes

2021 mise à jour : si vous rencontrez des erreurs comme Aucune règle pour fabriquer la cible '/usr/lib/libNOM.so', vous devez créer des liens symboliques vers les bibliothèques problématiques : sudo ln -s /usr/lib/x86_64-linux-gnu/libNOM.so /usr/lib/libNOM.so

1 votes

J'ai suivi les instructions de GLFW sur leur site Web (au lieu de créer votre fichier CMakeLists.txt) pour Linux, et elles fonctionnent comme prévu. Pour Raspberry Pi 3 A+ :p

0 votes

@ChristianidisVasileios Il se peut qu'en 3 ans depuis que j'ai posté cette réponse, et en 10 ans depuis que j'ai posté la question + réponse initiale, les choses se soient considérablement améliorées. J'aurais espéré autant. Si la situation a changé, veuillez poster une nouvelle réponse avec des détails.

13voto

Étant donné que la réponse acceptée ne permet pas d'apporter plus de modifications, je vais la résumer avec une seule commande de 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 tutoriel 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

et ensuite cliquez sur le bouton "Generate" dans le coin inférieur droit du site Web et téléchargez le fichier zip. Extraites-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 votes

Brillant! Ça a fonctionné pour moi sur Ubuntu 16.04 avec GLFW v3.2.1. Seules deux corrections mineures : set version=X.X.X devrait simplement être version="X.X.X" et il ne devrait pas y avoir de .zip à la fin de cette ligne : cd glfw-${version}.zip

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X