2012-09-02 62 views
3

這是我的makefile:未定義參考SDL_ * *許多

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 

當我編譯 「讓」 我得到了以下錯誤:

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

請確保您將以下答案之一標記爲正確。已經過了5個小時,你應該點擊其中一個答案附近的「複選框」。 –

回答

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) 

你把你的對象和庫是重要順序。

+0

謝謝!這也適用:) –

2

一個問題是您正在使用完全相同的標誌進行編譯和鏈接。編譯器不使用庫;鏈接器不懂迂腐。

更大的問題是您的-lSDL -lSDL_image在鏈接命令g++ $(CFLAGS) $(OBJ) Pantalla.o Imagen.o main.cpp -o main中出現得太早。鏈接器不會查看libSDL.a或libSDL_image.a(或它們的等價物),因爲在您指定搜索的位置沒有未解析的外部引用。將-lSDL -lSDL_image選項放在-o選項的前面。

+0

謝謝!這工作! –