2011-12-14 33 views
7

Tôi đã lập một dự án của tôi, sử dụng SDL, SDL_ttf, OpenAL và GTK. Tất cả đều xuất hiện các lỗi như sau:Ubuntu 11.10: GCC/G ++ sẽ không liên kết các thư viện

TxtFunc.cpp:(.text+0x61): undefined reference to `TTF_OpenFont' 
TxtFunc.cpp:(.text+0x8c): undefined reference to `TTF_RenderText_Solid' 
TxtFunc.cpp:(.text+0xf6): undefined reference to `SDL_UpperBlit' 
TxtFunc.cpp:(.text+0x108): undefined reference to `TTF_CloseFont' 
TxtFunc.cpp:(.text+0x114): undefined reference to `SDL_FreeSurface' 

cho mọi cuộc gọi thư viện. Tôi đang biên soạn với các tùy chọn liên kết sau đây:

sdl-config --libspkg-config gtk+-2.0 --libspkg-config openal --libs -lalut -lSDL_ttf

Tôi có tất cả các gói cài đặt, và không có "File không tìm thấy" lỗi. Chỉ cần rất nhiều tài liệu tham khảo không xác định ... Nó không có ý nghĩa, vì vậy tôi đã viết lên một ứng dụng test nhanh:

#include "SDL/SDL.h" 

int main() 
{ 
    SDL_Init(SDL_INIT_VIDEO); 
    return 0; 
} 

và biên dịch như sau:

g++ `sdl-config --libs --cflags` -o sdl-test ./sdl-test.cpp 

Tôi thậm chí còn cố gắng liên kết trực tiếp để "/usr/lib/libSDL-1.2.so.0" hoặc "/usr/lib/libSDL.a" thay vì

tất cả các tùy chọn kết thúc với cùng một kết quả:

/tmp/cc05XT8U.o: In function `main': 
sdl-test.cpp:(.text+0xa): undefined reference to `SDL_Init' 
collect2: ld returned 1 exit status 

Có ai có ý tưởng gì không?

Trả lời

13

Thông thường, bạn cần có các tùy chọn -l của mình sau các tệp sử dụng các ký hiệu trên dòng lệnh. Có lẽ thử di chuyển sdl-config --libs --cflags đến cuối lệnh? tức là cho chương trình thử nghiệm của bạn:

g++ -o sdl-test ./sdl-test.cpp `sdl-config --libs --cflags` 
+3

OP có thể cũng muốn đọc giải thích này về lý do tại sao thứ tự của thư viện trên dòng lệnh quan trọng: http://webpages.charter.net/ppluzhnikov/linker.html –

+0

Đó là nó! Cảm ơn! Tôi đoán tôi không bao giờ biết nó quan trọng, và đã luôn luôn xảy ra để viết nó một cách chính xác! Sử dụng tiếng Nga: Vâng, điều đó có ý nghĩa rất nhiều! Xin cảm ơn các bạn! – Caleb1994

0

Trong trường hợp bạn sử dụng SDL_ttf, bạn cần phải

g++ main.cpp -o sdl-test `sdl-config --libs --cflags` -lSDL_ttf 
1

Gah, mà pillock nảy sinh ý tưởng thay đổi trình biên dịch dựa nay vào thứ tự của các tùy chọn trong dòng lệnh?

Vâng, điều đó đã khắc phục được sự cố của tôi, chỉ cần di chuyển ($ CFLAGS) sau ($ OBJS) trong Makefile của tôi và tất cả các vấn đề liên kết của tôi với các tham chiếu chưa biết đến SDL libs đã biến mất>. <

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