3

这是我的生成文件:

CFLAGS = -Wall -pedantic -pedantic-errors -g -lSDL -lSDL_image
CC = g++
OBJ = Point.o Personaje.o Juego.o EventHandler.o

all: main

#%.o: %.cpp %.h
#   $(CC) -c $(CFLAGS) $<

bin: other $(OBJ)

Point.o: Point.cpp Point.h
    $(CC) -c $(CFLAGS) $<

Personaje.o: Personaje.cpp Personaje.h
    $(CC) -c $(CFLAGS) $<

Juego.o: Juego.cpp Juego.h
    $(CC) -c $(CFLAGS) $<

EventHandler.o: EventHandler.cpp EventHandler.h
    $(CC) -c $(CFLAGS) $<

main: $(OBJ)
    cd ../vista/; make
    cp ../vista/*.o .
    rm ../vista/*.o
    g++ $(CFLAGS) $(OBJ) Pantalla.o Imagen.o main.cpp -o main

clean:
    rm *.o;
    rm main

PHONY: main

当我使用“make”编译时,出现以下错误:

EventHandler.cpp:17: undefined reference to `SDL_PollEvent'
Pantalla.o: In function `Pantalla::initialize(int, int, int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
Pantalla.cpp:6: undefined reference to `SDL_Init'
Pantalla.cpp:9: undefined reference to `SDL_SetVideoMode'
Pantalla.cpp:14: undefined reference to `SDL_WM_SetCaption'

和许多其他错误。

“Pantalla.h”的标题包含这一行:

#include "SDL/SDL.h"

我已经安装了 SDL 包。

我不知道我做错了什么......请帮忙!

4

2 回答 2

5
CFLAGS = -Wall -pedantic -pedantic-errors -g -lSDL -lSDL_image

这不好。您将编译器标志(警告和调试)与链接器信息(您需要链接到哪些库)混合在一起。为此使用两个单独的变量:

CFLAGS = -Wall -pedantic -pedantic-errors -g
LIBS = -lSDL -lSDL_image

然后当你编译时(但不链接,即当你生成.o文件时),只使用$(CFLAGS)(就像你现在一样)。但是当您进行链接(以生成最终的可执行文件)时,请添加链接器指令。

g++ $(CFLAGS) -o main main.cpp $(OBJ) Pantalla.o Imagen.o $(LIBS)

放置对象和库的顺序很重要

于 2012-09-02T16:13:27.380 回答
2

一个问题是您使用完全相同的标志进行编译和链接。编译器不使用库;链接器不知道迂腐。

一个更大的问题是你-lSDL -lSDL_image在链接命令中出现得太早了,g++ $(CFLAGS) $(OBJ) Pantalla.o Imagen.o main.cpp -o main. 链接器不会查看 libSDL.a 或 libSDL_image.a(或它们的等价物),因为在您指定搜索的位置没有未解析的外部引用。将选项放在-lSDL -lSDL_image选项之前-o

于 2012-09-02T16:12:52.110 回答