2011-12-14 8 views
7

Fui a compilar un proyecto mío, que usa SDL, SDL_ttf, OpenAL y GTK. Todos los cuales están produciendo errores como los siguientes:Ubuntu 11.10: GCC/G ++ no vinculará bibliotecas

TxtFunc.cpp:(.text+0x61): undefined reference to `TTF_OpenFont' 
TxtFunc.cpp:(.text+0x8c): undefined reference to `TTF_RenderText_Solid' 
TxtFunc.cpp:(.text+0xf6): undefined reference to `SDL_UpperBlit' 
TxtFunc.cpp:(.text+0x108): undefined reference to `TTF_CloseFont' 
TxtFunc.cpp:(.text+0x114): undefined reference to `SDL_FreeSurface' 

para cada llamada a la biblioteca. Estoy compilando con las siguientes opciones de enlace:

sdl-config --libspkg-config gtk+-2.0 --libspkg-config openal --libs -lalut -lSDL_ttf

tengo todos estos paquetes instalados y no hay errores "Archivo no encontrado". Sólo un montón de referencias indefinidas ... No tenía sentido, así que escribió una aplicación de prueba rápida:

#include "SDL/SDL.h" 

int main() 
{ 
    SDL_Init(SDL_INIT_VIDEO); 
    return 0; 
} 

y compilar este modo:

g++ `sdl-config --libs --cflags` -o sdl-test ./sdl-test.cpp 

Incluso he intentado vincular directamente a "/usr/lib/libSDL-1.2.so.0" o "/usr/lib/libSDL.a" en lugar

todas estas opciones terminar con el mismo resultado:

/tmp/cc05XT8U.o: In function `main': 
sdl-test.cpp:(.text+0xa): undefined reference to `SDL_Init' 
collect2: ld returned 1 exit status 

¿Alguien tiene alguna idea?

Respuesta

13

Generalmente necesita tener sus -l opciones después de los archivos que usan los símbolos en la línea de comando. Tal vez intente mover el sdl-config --libs --cflags al final del comando? es decir, para su programa de pruebas:

g++ -o sdl-test ./sdl-test.cpp `sdl-config --libs --cflags` 
+3

OP también puede leer esta explicación de por qué el orden de las bibliotecas en línea de comandos es importante: http://webpages.charter.net/ppluzhnikov/linker.html –

+0

¡Eso fue todo! ¡Gracias! ¡Supongo que nunca supe que importaba y que siempre acababa de escribirlo correctamente! Ruso empleado: ¡Sí, eso tiene mucho sentido! ¡Gracias de nuevo chicos! – Caleb1994

0

En caso de que utilice SDL_ttf, es necesario

g++ main.cpp -o sdl-test `sdl-config --libs --cflags` -lSDL_ttf 
1

Gah, que pillock tuvo la idea de cambiar el compilador que confiar ahora en el orden de las opciones en el ¿línea de comando?

Bueno, eso solucionó mi problema también, acaba de mover ($ CFLAGS) después de ($ OBJS) en mi archivo Makefile y todos mis problemas de vinculación con referencias desconocidas a bibliotecas SDL se han ido>. <

Cuestiones relacionadas