2012-04-03 22 views
5

Escribí un programa en Ubuntu 11.04 que usa freeglut. Funcionó bien Luego obtuve otra computadora e intenté ejecutar el programa en una nueva instalación de Ubuntu 11.04. No funciona Así que instaléOpengl Linux referencia indefinida a funciones básicas

sudo apt-get install freeglut3 freeglut3-dev libglew1.5 libglew1.5-dev libglu1-mesa libglu 1-mesa-dev libgl1-mesa-glx libgl1-mesa-dev mesa-common-dev gcc

y trató de ejecutar el programa, que importa



    #include <GL/freeglut.h> 
    #include <GL/gl.h> 
    #include <GL/glu.h> 

usando el comando

g++ -lGL -lGLU -lglut Driver.cpp -o a

Sin embargo, el enlazador o lo escupe como 200 errores de la forma:



    Driver.cpp:(.text+0x3c6b): undefined reference to `glutSolidSphere' 
    Driver.cpp:(.text+0x3c75): undefined reference to `glEnable' 
    Driver.cpp:(.text+0x3c9a): undefined reference to `glColor4f' 
    Driver.cpp:(.text+0x3cb5): undefined reference to `glRotatef' 
    Driver.cpp:(.text+0x3d02): undefined reference to `glutSolidSphere' 
    Driver.cpp:(.text+0x3d07): undefined reference to `glutSwapBuffers' 

¿Cuál es la causa del problema?

+1

¿Por qué su archivo fuente se llama .cpp si compila con gcc? Si es C++, debe compilar con g ++, si es C, debe llamarse algo.c. – lvella

+0

Typo en la publicación. Estaba usando g ++ –

+0

¿Qué es este Driver.cpp? ¿Lo estás incluyendo desde program.cpp? – lvella

Respuesta

15

El orden en que especifica los objetos que desea vincular (incluidas las bibliotecas estáticas y dinámicas) puede ser importante.

intento con:

g++ Driver.cpp -lGL -lGLU -lglut -o a 

(. No estoy seguro sobre el orden de las librerías, pero que se ve bien)

La idea cuando se genera la línea de comandos es que si a requiere un símbolo de b, b debe aparecer después dea en la línea de comandos.

El problema de orden de enlace ocurre (o no) con GCC/ld para bibliotecas compartidas dependiendo de (lo más probable, entre otras cosas, no soy experto aquí) si el marcador de enlace --as-needed está configurado o no. (Consulte, por ejemplo, el artículo anterior a la última en la guía de transición as-needed de Gentoo.)
El proceso de vinculación elimina los símbolos innecesarios lo antes posible cuando --as-needed está activo, lo que causa problemas si el orden del enlace no es "correcto". Esto se hace para reducir el número de dependencias innecesarias presentes en los ejecutables finales.
Esto no ocurre (o menos) si --as-needed no está activo; todos los símbolos se guardan en ese caso, y el orden del enlace no importa tanto (más o menos - de nuevo, no soy experto)

Dado que las diferentes distribuciones usan diferentes valores predeterminados para esa bandera, el comportamiento de GCC puede parecer inconsistente, pero eso es solo una impresión.

+0

Eso suele ser un problema con las bibliotecas vinculadas estáticamente. No sé qué pudo haber causado el problema con las bibliotecas compartidas, que son el caso. – lvella