Cómo construir e instalar GLFW 3 y usarlo en un proyecto de Linux

95

GLFW3

Anoche estuve trabajando hasta tarde tratando de construir los paquetes GLFW 3 para Linux desde la fuente. Este proceso me llevó mucho tiempo, alrededor de 3 horas en total, en parte porque no estoy familiarizado con CMake y en parte porque no estaba familiarizado con GLFW.

¡Espero que esta publicación te salve de la dificultad que tuve ayer! Pensé que debería hacer una breve reseña y, con suerte, ahorrarle varias horas de su vida ...

Gracias a "urraka", "b6" y "niklas" en el canal de IRC #glfw, he podido hacer funcionar glfw versión 3.0.1.

Resulta que este no es un proceso trivial (ciertamente no para mí, no soy un experto) ya que no hay mucha documentación en la web sobre glfw3, particularmente sobre cómo configurarlo con CMake.

Se me pidió que dividiera esto en una sección de preguntas y respuestas, así que lo hice, y las partes de respuesta están ahora a continuación.

¿Es usted un mantenedor de GLFW o miembro del equipo de GLFW?

Si alguno de los mantenedores de GLFW3 ve esto, entonces mi mensaje para ellos es por favor agregue una sección de "configuración de GLFW3 en Windows, Mac OS X y Linux" a su sitio web. Es bastante fácil escribir programas con GLFW, ya que la documentación en línea es bastante buena, un escaneo rápido de todas las clases y módulos disponibles y estará listo para comenzar. El ejemplo de un proyecto de prueba presentado aquí también es muy bueno. Los dos problemas principales que encontré fueron, en primer lugar, ¿cómo configuro GLFW3 en mi sistema y, en segundo lugar, cómo puedo construir un proyecto GLFW3? Estas dos cosas quizás no sean lo suficientemente claras para un no experto.

Editar

Eché un breve vistazo hoy (Fecha: 2014-01-14), parece que el sitio web de GLFW ha sufrido grandes cambios desde la última vez que miré y ahora hay una sección sobre la compilación de GLFW y programas de construcción con GLFW, que creo que son nuevos.

usuario3728501
fuente
Gracias por poner esto aquí; obviamente, se ha invertido mucho trabajo en ello. Sin embargo, ¿le importaría dividirlo en una pregunta y una respuesta? Puede agregar su propia respuesta a su propia pregunta y marcarla como correcta.
Fraser
@Fraser Sí, por supuesto, si crees que sería mejor de esa manera
user3728501
1
Secundo que. Me gusta mucho GLFW, pero me frustró mucho no encontrar ninguna documentación sobre cómo compilar v3 en Mac, etc.
user18490
1
@ user18490 Sí, me pareció un poco sorprendente, ya que GLFW parece ser "un exceso mejor". Estoy seguro de que mencionaron en su documentación que el exceso solo es bueno para aprender y si desea una biblioteca de ventanas profesional, use GLFW. Entonces, lo sorprendente es que te dicen lo bueno que es, ¡pero no te dicen cómo instalarlo! (A diferencia de SFML)
user3728501
@Edward Bird. Finalmente encontré información útil en esta página web sobre la instalación de GLFW: scratchapixel.com/lessons/3d-basic-lessons/lesson-2-get-started/…
user18490

Respuestas:

125

Paso 1: Instalar GLFW 3 en su sistema con CMAKE

Para esta instalación, estaba usando KUbuntu 13.04, 64bit.

El primer paso es descargar la última versión (asumiendo que las versiones en el futuro funcionen de manera similar) desde www.glfw.org , probablemente usando este enlace .

El siguiente paso es extraer el archivo y abrir una terminal. cden el directorio glfw-3.XX y ejecutarlo, cmake -G "Unix Makefiles"es posible que necesite privilegios elevados, y es posible que también deba instalar las dependencias de compilación primero . Para ello, tratar sudo apt-get build-dep glfw o sudo apt-get build-dep glfw3 o hacerlo de forma manual , como lo hice utilizando sudo apt-get install cmake xorg-dev libglu1-mesa-dev... Puede haber otras librerías que se requieren, tales como las bibliotecas pthread ... Al parecer les había hecho ya. (Vea las opciones -l dadas a la etapa del enlazador g ++, a continuación).

Ahora puede escribir makey luego make install, lo que probablemente requiera que lo haga sudoprimero.

De acuerdo, debería obtener una salida detallada en las últimas tres etapas de CMake, que le indique qué se ha construido o dónde se ha colocado. (En /usr/include, por ejemplo.)

Paso 2: cree un programa de prueba y compile

El siguiente paso es encender vim ("¿qué ?! ¡¿vim?!", Dices) o tu IDE / editor de texto preferido ... No usé vim, usé Kate, porque estoy en KUbuntu 13.04 ... De todos modos, descargue o copie el programa de prueba desde aquí (en la parte inferior de la página) y guarde, salga.

Ahora compile usando g++ -std=c++11 -c main.cpp- no estoy seguro de si se requiere c ++ 11 pero lo usé nullptr, lo necesitaba ... Puede que necesite actualizar su gcc a la versión 4.7, o la próxima versión 4.8 ... Información sobre eso aquí .

Luego corrige tus errores si escribiste el programa a mano o trataste de ser "demasiado inteligente" y algo no funcionó ... ¡Entonces vincúlalo usando este monstruo! g++ main.o -o main.exec -lGL -lGLU -lglfw3 -lX11 -lXxf86vm -lXrandr -lpthread -lXiComo puede ver, en la parte "instalar dependencias de compilación", es posible que también desee comprobar que tiene las bibliotecas de desarrollo GL, GLU, X11 Xxf86vm (lo que sea) Xrandr posix-thread y Xi (lo que sea) instaladas también. Quizás actualice sus controladores de gráficos también, creo que GLFW 3 puede requerir OpenGL versión 3 o superior. ¿Quizás alguien pueda confirmar eso? Es posible que también deba agregar las opciones del vinculador -ldl -lXinerama -lXcursorpara que funcione correctamente si obtiene referencias no definidas a dlclose(crédito a @ user2255242).

Y, sí, ¡realmente necesitaba tantos -lcorreos electrónicos!

Paso 3: ¡Has terminado, que tengas un buen día!

Con suerte, esta información fue correcta y todo funcionó para usted, y disfrutó escribiendo el programa de prueba GLFW. También espero que esta guía ha ayudado, o va a ayudar, unas pocas personas en el futuro que luchaban como lo fue hoy ayer!

Por cierto, todas las etiquetas son las cosas que busqué en stackoverflow buscando una respuesta que no existía. (Hasta ahora). Ojalá sean lo que buscaste si estuvieras en una posición similar a la mía.

Nota del autor:

Puede que no sea una buena idea. Este método (usando sudo make install) puede ser peligroso para su sistema. (Consulte No rompa Debian)

Idealmente, yo, o alguien más, debería proponer una solución que no solo instale archivos lib, etc.en los directorios predeterminados del sistema, ya que estos deberían ser administrados por administradores de paquetes como apt, y hacerlo puede causar un conflicto y romper su sistema de administración de paquetes.

Consulte la nueva "respuesta 2020" para obtener una solución alternativa.

usuario3728501
fuente
Pasé horas tratando de resolver esto. Esta respuesta funcionó para mí: Ubuntu 13.04, x64. NetBeans C ++ IDE (agregue la línea del vinculador en Propiedades del proyecto-> Compilación-> Vinculador-> Bibliotecas-> Agregar opción-> Otra opción; de lo contrario, siga las instrucciones textualmente)
Scott Drew
Aparentemente (con GLFW 3.0.3) algo usa, powasí que agregar -lma las opciones de compilación lo solucionó.
Forest Katsch
1
Edward, gracias. Necesitaba esta comprobación de cordura de que todos los requisitos -l no solo significaban que estaba haciendo algo mal.
wrongu
3
amigo eres un genio de mierda !!!! tienes 3 horas, yo tengo 3 días tratando de hacer esto (en realidad investigando desde dónde empezar, leyendo sobre la historia del exceso y así sucesivamente, de todos modos) gracias muchas gracias muchas jodidas muchas; También me gustaría advertir que leí la página de glfw, no pude hacer el trabajo siguiendo su tutorial, casi me rendí cuando encontré esto y no explican tan simple y directo como lo haces. increíble trabajo que hiciste aquí !!
Victor R. Oliveira
1
En un Linux Mint limpio tuve que instalar estos paquetes:sudo apt-get update && sudo apt-get install build-essential libevent-pthreads-2.0.5 doxygen xorg-dev libglu1-mesa-dev
Lenar Hoyt
18

Lo resolví de esta manera

Un archivo pkg-config describe todos los indicadores y dependencias de tiempo de compilación y tiempo de enlace necesarios para usar una biblioteca.

pkg-config --static --libs glfw3

me muestra eso

-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  

No sé si todas estas bibliotecas son realmente necesarias para la compilación, pero para mí funciona ...

Oleh Pomazan
fuente
3
Esta respuesta es imprescindible. No sabía sobre pkg-config antes. Pero a partir de hoy lo usaré hasta el final, porque me ayudará a resolver cualquier tipo de problema de dependencia de enlaces. Gracias por una respuesta tan asombrosa.
Sayan Bhattacharjee
18

Tenga en cuenta que no necesita tantos -lcorreos electrónicos si instala glfw con la BUILD_SHARED_LIBSopción. (Puede habilitar esta opción ejecutando ccmakeprimero).

De esta forma sudo make installinstalará la biblioteca compartida en /usr/local/lib/libglfw.so. Luego puede compilar el archivo de ejemplo con un simple:

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

Entonces no olvide agregar / usr / local / lib / a la ruta de búsqueda de bibliotecas compartidas antes de ejecutar su programa. Esto se puede hacer usando:

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

Y puede poner eso en su ~/.bashrcpara no tener que escribirlo todo el tiempo.

CastleDefender
fuente
1
esta información es realmente importante para aquellos que deseen configurar un IDE en lugar de usar la terminal para compilar y ejecutar; ¿Podría dar más detalles sobre cómo hacer esto? Lo intenté pero no tuve éxito en absoluto
Victor R. Oliveira
¡Noob aquí! Sé que esto es un poco viejo, pero realmente me ayudó. ¿Alguien puede explicar (o vincular a alguien que explique) por qué el uso de una biblioteca compartida haría que no tengamos que vincular todas esas otras bibliotecas, muchas de las cuales también eran archivos de objetos compartidos? Además, tuve que configurar la variable LD_LIBRARY_PATH después de compilar, o enfrentar la ira de los errores gnu cuando trato de ejecutar mi ejecutable recién compilado.
Sammaron
1
Hola Sammaron, gracias por hablar sobre LD_LIBRARY_PATH, actualizaré mi respuesta para incluir esto. La razón por la que no tiene que especificar todas las demás bibliotecas cuando usa la biblioteca glfw es porque glfw ya las carga. Puede usar el comando lddpara verificar qué bibliotecas carga un programa cuando se ejecuta. También es una buena forma de comprobar que las bibliotecas se encuentran correctamente. Puede usar ldden su programa y en /usr/local/lib/libglfw.so para comparar.
CastleDefender
¡Gracias por la respuesta! Además, quería corregirme un poco: la variable LD_LIBRARY_PATH es una solución viable, pero si la biblioteca se instaló en la ruta estándar que el cargador buscará de todos modos, la ejecución sudo ldconfigdebería resolver este problema y no requerir la configuración de LD_LIBRARY_PATH cada vez. Esta respuesta proporciona una discusión sobre por qué esto podría ser preferible.
Sammaron
Después de hacer con build shared, tuve que compilar / vincular otros 2. g ++ main.cpp -L / usr / local / lib / -lglfw -lGLU -lGL funcionó para mí.
Sridhar Thiagarajan
9

Dado que la respuesta aceptada no permite más ediciones, la resumiré con un solo comando copiar y pegar (Reemplace 3.2.1 con la última versión disponible en la primera línea):

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 desea compilar un programa, utilice los siguientes comandos:

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 está siguiendo el tutorial de learnopengl.com, es posible que también deba configurar GLAD. En tal caso, haga clic en este enlace

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

y luego haga clic en el botón "Generar" en la esquina inferior derecha del sitio web y descargue el archivo zip. Extraerlo y compilar las fuentes con el siguiente comando:

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

Ahora, los comandos para compilar su programa se vuelven así:

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
fuente
2
¡Brillante! Me funcionó en Ubuntu 16.04 con GLFW v3.2.1. Solo dos correcciones menores: set version = XXX debería ser simplemente version = "XXX" y no debería haber .zip al final de esta línea: cd glfw - $ {version} .zip
Tim
2

Gran guía, gracias. Dadas la mayoría de las instrucciones aquí, casi se construyó para mí, pero tuve un error restante.

/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

Después de buscar este error, tuve que agregarlo -ldla la línea de comando.

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

Luego, la aplicación de muestra "hola GLFW" se compiló y se vinculó.

Soy bastante nuevo en Linux, así que no estoy completamente seguro de qué hace exactamente esta biblioteca adicional ... aparte de corregir mi error de enlace. Sin embargo, veo ese interruptor de línea cmd en la publicación anterior.

usuario2941878
fuente
Tengo el archivo .o y .exec .. por favor ayúdenme, ¿cómo ejecutarlo?
Buddhika Chaturanga
0

Si alguien se está volviendo perezoso y tal vez no sepa cómo configurar el shell para todas esas bibliotecas y -l s, entonces creé un script de Python (tienes que tener python3, la mayoría de los usuarios de Linux lo tienen) que te permite compilar fácilmente scripts y ejecutarlos sin preocuparme mucho, solo tiene llamadas regulares al sistema, simplemente organizadas cuidadosamente, lo creé para mí, pero tal vez sería útil: Aquí está

matemáticas
fuente
0

La respuesta bien descrita ya está ahí, pero pasé por esta receta MÁS CORTA :

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

Explicación: Logramos construir GLFW por CMAKE que se hace con Linuxbrew (puerto Linux del amado Homebrew). Luego copie los archivos de encabezado donde Linux lee desde ( /usr/include).

Shayan Amani
fuente
0

Respuesta actualizada 2020

Es 2020 (7 años después) y he aprendido más sobre Linux durante este tiempo. Específicamente, puede que no sea una buena idea ejecutarlo sudo make installal instalar bibliotecas, ya que pueden interferir con el sistema de administración de paquetes. (En este caso apt, estoy usando Debian 10.)

Si esto no es correcto, corríjame en los comentarios.

Solución alternativa propuesta

Esta información se toma de los documentos GLFW, sin embargo, he ampliado / simplificado la información que es relevante para los usuarios de Linux.

  • Vaya al directorio de inicio y clone el repositorio glfw desde github
cd ~
git clone https://github.com/glfw/glfw.git
cd glfw
  • En este punto, puede crear un directorio de compilación y seguir las instrucciones aquí ( instrucciones de compilación de glfw ), sin embargo, decidí no hacerlo. El siguiente comando todavía parece funcionar en 2020, sin embargo, las instrucciones en línea de glfw no lo indican explícitamente.
cmake -G "Unix Makefiles"
  • Es posible que deba ejecutar sudo apt-get build-dep glfw3antes (?). Ejecuté este comando y sudo apt install xorg-devsegún las instrucciones.

  • Finalmente corre make

  • Ahora en el directorio de su proyecto, haga lo siguiente. (Vaya a su proyecto que usa las librerías glfw)

  • Crea un CMakeLists.txt, el mío se ve así

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 no le gusta CMake, le pido disculpas, pero en mi opinión, es la forma más fácil de hacer que su proyecto funcione rápidamente. Recomendaría aprender a usarlo, al menos hasta un nivel básico. Lamentablemente no conozco ningún buen tutorial de CMake

  • Luego hazlo cmake .y make, tu proyecto debe estar construido y vinculado con la lib compartida glfw3

  • Hay alguna forma de crear una biblioteca vinculada dinámica. Creo que he usado el método estático aquí. Comente / agregue una sección en esta respuesta a continuación si sabe más que yo

  • Esto debería funcionar en otros sistemas, si no, avíseme y lo ayudaré si puedo

usuario3728501
fuente