这是我的makefile:
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软件包。
我不知道我做错了什么......请帮忙!
答案 0 :(得分:4)
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)
您放置对象和库的顺序非常重要。
答案 1 :(得分:2)
一个问题是您使用完全相同的标志进行编译和链接。编译器不使用库;链接器不知道迂腐。
更大的问题是,您的-lSDL -lSDL_image
在链接命令g++ $(CFLAGS) $(OBJ) Pantalla.o Imagen.o main.cpp -o main
中显得过早。链接器不会查看libSDL.a或libSDL_image.a(或它们的等价物),因为在您指定搜索的位置没有未解析的外部引用。将-lSDL -lSDL_image
选项放在-o
选项之前。