2011-11-25 41 views
6

Ok, ive đã đọc khoảng 10 hướng dẫn, nhưng tôi luôn gặp lỗi, tôi có 5 tệp, main.cpp class.cpp, class.h và functions.cpp và functions.h. Tất cả các hàm sử dụng đó từ các đối tượng khác nhau đều có nghĩa là các hàm trong hàm.cpp sử dụng các đối tượng từ classes.cpp.Tài liệu tham khảo không xác định trong makefile

makefile của tôi trông như sau

CC = g++ -O2 -I./sdl/include -L. 
LIBS = -lm -lSDL -lpthread -ldl 
SRC = main.cpp 
SDLF = SDLfunctions.cpp 
CLASS = classes.cpp 
CLASSH = classes.h 
SDLFH = SDLfunctions.h 

all: main 

main: SDLfunctions.o Classes.o $(SRC) 
    $(CC) -o [email protected] $(SRC) $(LIBS) 

SDLfunctions.o: $(SDLFH) $(SDLF) $(CLASS) $(CLASSH) 
    $(CC) -o [email protected] $(SDLF) $(LIBS) 

Classes.o: $(CLASS) $(CLASSH) $(SDLF) $(SDLFH) 
    $(CC) -o [email protected] $(CLASS) $(LIBS) 

Tôi tiếp tục nói với tôi rằng nó đã không xác định tài liệu tham khảo. Tôi đang thiếu gì?

makefile gì đầu ra

/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5.2/../../../crt1.o: In function `_start': 
(.text+0x18): undefined reference to `main' 
/tmp/ccJG6yQA.o: In function `DrawEnemies(SDL_Surface*)': 
SDLfunctions.cpp:(.text+0x3a7): undefined reference to `Enemy::sprite' 
/tmp/ccJG6yQA.o: In function `rysujpociski(int, SDL_Surface*, SDL_Surface*, 
std::vector<AllyBullet, std::allocator<AllyBullet> >&, double)': 
SDLfunctions.cpp:(.text+0x141f): undefined reference to `AllyBullet::sprite' 
/tmp/ccJG6yQA.o: In function `global constructors keyed to width': 
SDLfunctions.cpp:(.text+0x14a7): undefined reference to `Enemy::Enemy()' 
collect2: ld returned 1 exit status 
make: *** [SDLfunctions.o] Error 1 

Các tập tin biên dịch tuyệt vời khi tôi đã có chúng trong Visual C++, vì vậy nó phải được makefile của tôi.

+0

Vui lòng đăng đầu ra. Những gì không xác định tài liệu tham khảo? – EFraim

+1

Khi chạy, bạn sẽ thấy các lệnh được thực thi. Chúng có khác biệt với các lệnh bạn sẽ gõ để biên dịch nó theo cách thủ công không? – rodrigo

+1

Cải thiện tiêu đề câu hỏi để vui lòng _describes_ câu hỏi. –

Trả lời

7

Bạn đang thực sự làm điều gì đó kỳ lạ. Những gì bạn cần để biên dịch (-c) các tệp đối tượng và sau đó liên kết chúng với nhau. Điều này sẽ trông giống như sau:

CC = g++ -O2 -I./sdl/include -L. 
LIBS = -lm -lSDL -lpthread -ldl 
SRC = main.cpp 
SDLF = SDLfunctions.cpp 
CLASS = classes.cpp 
CLASSH = classes.h 
SDLFH = SDLfunctions.h 

all: main 

main: SDLfunctions.o Classes.o $(SRC) 
    $(CC) -o [email protected] $(SRC) SDLfunctions.o Classes.o $(LIBS) # you forgot to link 
                 # the object files 

SDLfunctions.o: $(SDLFH) $(SDLF) $(CLASS) $(CLASSH) 
    $(CC) -o [email protected] -c $(SDLF)  # -c added to compile, not link 

Classes.o: $(CLASS) $(CLASSH) $(SDLF) $(SDLFH) 
    $(CC) -o [email protected] -c $(CLASS)  # -c added to compile, not link 

Trong khi bạn đang làm điều này, nó thậm chí còn tốt hơn nếu bạn cũng biên dịch riêng. Do đó:

CC = g++ -O2 -I./sdl/include -L. 
LIBS = -lm -lSDL -lpthread -ldl 
MAIN = main.cpp 
SDLF = SDLfunctions.cpp 
CLASS = classes.cpp 
CLASSH = classes.h 
SDLFH = SDLfunctions.h 

all: main 

main: SDLfunctions.o Classes.o main.o 
    $(CC) -o [email protected] SDLfunctions.o Classes.o main.o $(LIBS) 

main.o: $(SDLFH) $(MAIN) $(CLASSH) 
    $(CC) -o [email protected] -c $(MAIN) 

SDLfunctions.o: $(SDLFH) $(SDLF) $(CLASS) $(CLASSH) 
    $(CC) -o [email protected] -c $(SDLF) 

Classes.o: $(CLASS) $(CLASSH) $(SDLF) $(SDLFH) 
    $(CC) -o [email protected] -c $(CLASS) 

Cũng lưu ý rằng tôi loại bỏ các $(LIBS) khi sử dụng -c vì liên kết không xảy ra sau đó.

+0

cảm ơn bạn rất nhiều :) –

2

Bạn có lỗi đánh máy. Bạn đang sử dụng $(CLASSESH) nhưng đã khai báo CLASSH.

+0

cố định, nhưng không giúp được –

6

Bạn đang cố liên kết các tệp .o của mình vào tệp thi hành. Thêm một -c vào các cờ biên dịch để nó biên dịch chỉ cho các tệp đối tượng của bạn.

Làm cho nó tùy chọn đầu tiên như thế này

SDLfunctions.o: $(SDLFH) $(SDLF) $(CLASS) $(CLASSH) 
    $(CC) -c -o [email protected] $(SDLF) $(LIBS) 
+0

tôi nhận được "g ++: SDLfunctions.o: Không có tệp hoặc thư mục như vậy" –

Các vấn đề liên quan