2013-05-01 4 views
0

Je travaille avec la bibliothèque SDL et SDL_mixer et je obtenir les erreurs suivantes quand je compilent:erreurs de la liaison avec la bibliothèque SDL_mixer

.... 
game.cpp:(.text+0x88f): undefined reference to `Mix_OpenAudio' 
Jukebox.o: In function `Jukebox::~Jukebox()': 
Jukebox.cpp:(.text+0x17): undefined reference to `Mix_FreeChunk' 
Jukebox.cpp:(.text+0x27): undefined reference to `Mix_FreeChunk' 
Jukebox.cpp:(.text+0x37): undefined reference to `Mix_FreeChunk' 
Jukebox.cpp:(.text+0x47): undefined reference to `Mix_FreeChunk' 
.... 

Et ainsi de suite et ainsi de suite ou tous les cas où j'utilise une fonction de SDL_mixer . Je suis assez confiant que l'erreur réside dans le Makefile parce qu'il compile juste bien dans un autre programme de test que j'ai fait.

Mon Makefile

SDL= -lSDL -lSDL_mixer 

OBJ=game.o Jukebox.o ... 

all: main 

main: $(OBJ) 
     g++ $(SDL) $(OBJ) -o main 

%.o: %.cpp 
     g++ $(SDL) -c $< 

clean: 
     rm -f *.o *~ main 
     rm -f */*~ 

Où est l'erreur?

Répondre

3

Je pense que le problème est l'ordre de vos arguments.

Au lieu de

main: $(OBJ) 
     g++ $(SDL) $(OBJ) -o main 

essayer

main: $(OBJ) 
     g++ -o main $(OBJ) $(SDL) 

Bien que la position de l'ordre des bibliothèques de liens -o principal n'est pas vraiment important, est. Les compilateurs résolvent les symboles dans l'ordre dans lequel les bibliothèques apparaissent sur la ligne de commande.

+0

Cool! Merci beaucoup pour la réponse. Travaillé comme un charme. – MrDiggles

1

Il semble que votre éditeur de liens ne trouve pas l'emplacement des bibliothèques. Identifiez où ils ont été installés et transmettez ce chemin à l'éditeur de liens via la directive -L.

Mettez quelque chose comme ceci: SDL = -L/chemin/vers/installé/SDL/bibliothèques -lSDL -lSDL_mixer

Notez que, dans: g ++ $ (SDL) -c < $ la variable $ (SDL) n'est pas pertinent, une fois que vous ne vous connectez pas à votre programme, mais que vous générez simplement les objets.

+0

Où les bibliothèques seraient-elles situées? J'ai trouvé des fichiers .a .la et .so dans/lib, alors devrais-je simplement utiliser/lib comme chemin? Tomás – MrDiggles

+0

Tomás si le compilateur, ou plus précisément l'éditeur de liens, n'a pas pu trouver la bibliothèque, il le signale généralement. Si tel était le cas, vous vous attendez à voir quelque chose comme 'ld: library non trouvé pour -lSDL_mixer collect2: ld a renvoyé 1 status de sortie'. Donc, dans le cas de l'OP, l'éditeur de liens a trouvé une version de la bibliothèque ... Bien sûr, ce n'était peut-être pas la version correcte! – idz

Questions connexes