对SDL_Freesurface的未定义引用

时间:2015-01-24 03:26:53

标签: c makefile sdl

编译程序时遇到问题。

首先,这是我正在使用的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;
在main.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,或者我在制作全局变量时失败了。为什么它告诉我“未定义的参考”? 感谢。

编辑:我运行了sdl-config --libs - &gt;输出:

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

1 个答案:

答案 0 :(得分:2)

main.h中,您将eventmap声明为全局变量。

main.c中,您将eventmap定义为loadGame()内的局部变量。这些隐藏了全局变量定义(gcc -Wshadow会告诉你这个。)

您展示的代码都没有定义外部变量。

可能需要将loadGame()中显示的两条线移到函数外部;这将治愈eventmap缺少的参考文献。

问题标题提及SDL_FreeSurface,但问题的其余部分并未提及。我会猜测,但您可能需要在-lSDL_image之前而不是之后链接-lSDL