2015-01-24 5 views
0

У меня возникают проблемы при компиляции моей программы.Неопределенная ссылка на SDL_Freesurface

Во-первых, здесь Makefile, Я использую:

LFLAGS = `sdl-config --cflags` `sdl-config --libs` -lSDL -lSDL_image 
CFLAGS = -I/usr/include/SDL 
HFLAGS = main.h fisherman.h jdv.h 
all: jdv 

jdv: main.o fisherman.o jdv.o 
    gcc main.o fisherman.o jdv.o $(LFLAGS) -o jdv -g -Wall 
main.o: main.c $(HFLAGS) 
    gcc -c main.c $(CFLAGS) 
fisherman.o: fisherman.c $(HFLAGS) 
    gcc -c fisherman.c $(CFLAGS) 
jdv.o: jdv.c $(HFLAGS) 
    gcc -c jdv.c $(CFLAGS) 
clean: 
    rm -f *.o 

Образец программы:

в main.h

extern SDL_Surface * event; 
extern SDL_Surface * map; 

в основной .c

#include <SDL/SDL.h> 
#include <SDL/SDL_image.h> 
#include <SDL/SDL_ttf.h> 
#include "main.h" 

    void loadGame() 
     { 
      SDL_Surface * event = NULL; 
      SDL_Surface * map = NULL; 
     ... 
     } 

А вот выход:

make 
gcc main.o fisherman.o jdv.o `sdl-config --cflags` `sdl-config --libs` -lSDL -lSDL_image -lSDL_mixer -o jdv -g -Wall 
main.o: in « main »: 
main.c:(.text+0x119): undefined reference to « event » 
main.c:(.text+0x195): undefined reference to « event » 
main.c:(.text+0x1d1): undefined reference to « map » 

И он идет за ~ 75 ошибок, как это на другой переменной. Но все они связаны с глобальной переменной.

Я думаю, что это связано с проблемой связывания, но я не знаю, исходит ли это из моего файла makefile, или я не смог создать глобальную переменную. Почему это говорит мне об «неопределенной ссылке»? Спасибо.

EDIT: Я побежал СДЛ-конфигурации --libs -> Выход:

-L/usr/lib/x86_64-linux-gnu -lSDL 
+0

Можете ли вы просто запустить командную строку 'sdl-config -libs' и вставить нашput? – user902384

ответ

2

main.h В, вы объявляете event и map как глобальные переменные.

В main.c вы определяете event и map как локальные переменные внутри loadGame(). Они скрывают определения глобальных переменных (и gcc -Wshadow расскажет вам об этом).

Ни один из кода, который вы показываете, не определяет внешние переменные.

Возможно, вам нужно переместить две линии, показанные в loadGame() вне функции; что бы устранить недостающие ссылки event и map.

Вопрос название упоминает SDL_FreeSurface, но остальная часть вопроса не делает. Я сделаю дикое предположение, но, возможно, вам нужно связать -lSDL_image до -lSDL, а не после.