2011-12-14 16 views
7

Sono andato a compilare un mio progetto che utilizza SDL, SDL_ttf, OpenAL e GTK. Tutti questi errori vengono visualizzati come segue:Ubuntu 11.10: GCC/G ++ non collegherà le librerie

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' 

per ogni chiamata di libreria. Sto compilazione con le seguenti opzioni di collegamento:

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

ho tutti questi pacchetti installati, e non ci sono errori "File non trovato". Solo un sacco di riferimenti indefiniti ... Non aveva senso, così ho scritto una rapida applicazione di test:

#include "SDL/SDL.h" 

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

e compilare in questo modo:

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

Ho anche provato che collega direttamente a "/usr/lib/libSDL-1.2.so.0" o "/usr/lib/libSDL.a" invece

tutte queste opzioni finire con la stessa uscita:

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

Qualcuno ha qualche idea?

risposta

13

In genere è necessario disporre delle opzioni -l dopo i file che utilizzano i simboli sulla riga di comando. Forse prova a spostare lo sdl-config --libs --cflags alla fine del comando? vale a dire per il tuo programma di test:

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

OP potrebbe voler leggere anche questa spiegazione del motivo per cui l'ordine delle librerie sulla riga di comando è importante: http://webpages.charter.net/ppluzhnikov/linker.html –

+0

È stato! Grazie! Immagino di non averlo mai capito, e mi è sempre capitato di scriverlo correttamente! Russo impiegato: Sì, questo ha molto senso! Grazie ancora ragazzi! – Caleb1994

0

Nel caso in cui si utilizza SDL_ttf, è necessario

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

Gah, che pillock venuta l'idea di cambiare il compilatore a fare affidamento ora in poi l'ordine delle opzioni nel riga di comando?

Bene, questo ha risolto anche il mio problema, appena spostato ($ CFLAGS) dopo ($ OBJS) nel mio Makefile e tutti i miei problemi di collegamento con riferimenti sconosciuti alle librerie SDL sono andati>. <

Problemi correlati