2013-05-01 2 views
0

Я работаю с библиотекой SDL и SDL_mixer и я получаю следующие ошибки при компиляции:Связывание ошибок с библиотекой 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' 
.... 

И так далее, и так далее, или все случаи, когда я использую функцию SDL_mixer ,

Я довольно уверен, что ошибка лежит в Makefile, потому что она компилируется просто отлично в другой тестовой программе, которую я сделал.

Мои 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 */*~ 

Где ошибка?

ответ

3

Я думаю, что проблема в порядке ваших аргументов.

Вместо

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

попробовать

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

Хотя положение -о главное, на самом деле не важно, порядок библиотек есть. Компиляторы разрешают символы в том порядке, в котором библиотеки отображаются в командной строке.

+0

Прохладный! Большое спасибо за ответ. Работал как шарм. – MrDiggles

1

Кажется, что вы не можете найти, где находятся библиотеки. Определите, где они были установлены, и передайте этот путь в компоновщик через директиву -L.

Положите что-то вроде этого: SDL = -L/путь/к/установлен/SDL/библиотеки -lSDL -lSDL_mixer

Обратите внимание, что, в: г ++ $ (SDL) -c $ < переменной $ (SDL) не имеет значения, как только вы не связываетесь с вашей программой, а просто создаете объекты.

+0

Где будут расположены библиотеки? Я нашел файлы .a .la и .so в/lib, так что я бы просто использовал/lib как путь? – MrDiggles

+0

Tomás, если компилятор, или, более конкретно, компоновщик, не смог найти библиотеку, которая обычно сообщает об этом. Если бы это было так, вы ожидали увидеть что-то вроде 'ld: library not found for -lSDL_mixer collect2: ld возвратил 1 статус выхода'. Итак, в случае OP, компоновщиком была найдена какая-то версия библиотеки ... Конечно, она, возможно, не была правильной! – idz

Смежные вопросы