2013-10-14 22 views
5

Tôi bắt đầu với lập trình SDL và C. Tôi có kinh nghiệm với các ngôn ngữ lập trình khác, nhưng việc liên kết/biên dịch các thư viện trong C là mới đối với tôi. Tôi đang sử dụng Mac 10.8 và đã cài đặt phiên bản 2.0 ổn định mới nhất bằng cách sử dụng hướng dẫn trong phần đọc tôi (./configure; make; make install). Đây là đoạn mã mẫu mà tôi đang cố gắng để biên dịch:Làm thế nào để biên dịch một chương trình SDL ví dụ được viết bằng C?

#include <stdlib.h> 
#include <stdio.h> 
#include "SDL.h" 

int main(void) 
{ 
    if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER) != 0) { 
    fprintf(stderr, "\nUnable to initialize SDL: %s\n", SDL_GetError()); 
    return 1; 
    } 
    atexit(SDL_Quit); 

    return 0; 
} 

Khi tôi cố gắng biên soạn kịch bản của tôi sử dụng gcc example.c, tôi nhận được một lỗi:

example.c:3:17: error: SDL.h: No such file or directory 
example.c: In function ‘main’: 
example.c:7: error: ‘SDL_INIT_VIDEO’ undeclared (first use in this function) 
example.c:7: error: (Each undeclared identifier is reported only once 
example.c:7: error: for each function it appears in.) 
example.c:7: error: ‘SDL_INIT_TIMER’ undeclared (first use in this function) 
example.c:8: warning: format ‘%s’ expects type ‘char *’, but argument 3 has type ‘int’ 
example.c:8: warning: format ‘%s’ expects type ‘char *’, but argument 3 has type ‘int’ 
example.c:11: error: ‘SDL_Quit’ undeclared (first use in this function) 

Tôi đã cố gắng tìm kiếm trên wiki, và hướng dẫn, và bất kỳ loại tài liệu nào mà tôi có thể tìm thấy, nhưng tôi không thể tìm thấy bất kỳ ví dụ nào cho thấy cách biên dịch đúng chương trình C sử dụng SDL.

Tôi cần làm gì để biên dịch chương trình này?

Trả lời

9

Một gợi ý chung cho người mới bắt đầu C: đọc các bản ghi lỗi từ trên xuống: thường sửa lỗi đầu tiên sẽ giải quyết tất cả khác. Trong trường hợp của bạn lỗi đầu tiên là:

example.c:3:17: error: SDL.h: No such file or directory 

Như những người khác đã nói, bạn cần phải hướng dẫn gcc nơi để tìm SDL.h. Bạn có thể làm điều này bằng cách cung cấp tùy chọn -I.

Để kiểm tra nơi SDL.h được cài đặt theo mặc định tôi sẽ phát hành

./configure --help 

trong thư mục mà bạn đã xây dựng libsdl. Sau đó tìm kiếm --prefix, dưới tiền tố mặc định của Linux thường là /usr/local. Để biên dịch dụ của bạn tôi sẽ phát hành (trên Linux):

gcc example.c -I/usr/local/include 

Nhưng lệnh trên biên dịch liên kết mã. Sau khi biên dịch thành công, gcc sẽ ném một loạt lỗi khác, một trong số đó là undefined reference.

Để ngăn chặn điều đó, đầy đủ dòng lệnh để xây dựng ví dụ của bạn (trên Linux ít nhất) sẽ là:

gcc example.c -I/usr/local/include -L/usr/local/lib -lSDL 

đâu:

  • -I điểm biên dịch vào thư mục với SDL.h,
  • -L điểm liên kết đến thư mục với libSDL.a (hoặc libSDL.so),
  • -l hướng dẫn liên kết liên kết với thư viện, trong trường hợp của chúng tôi libSDL.a hoặc libSDL.so.Lưu ý rằng tiền tố lib và hậu tố .a/.so bị thiếu.

Xin lưu ý rằng tôi đã không kiểm tra hướng dẫn này, ngay cả trên máy Linux (mặt khác tôi không có quyền truy cập vào máy Mac OS).

Một điều nữa: theo mặc định nhị phân với ví dụ được biên dịch và liên kết sẽ được gọi là a.out. Để thay đổi điều đó, bạn có thể cung cấp tùy chọn -o tới gcc.

+0

Điều đó thực sự hữu ích, cảm ơn bạn! – Andrew

6

Tôi phát hiện ra bạn có thể sử dụng một công cụ gọi là pkg-config để tìm hiểu cờ trình biên dịch dự kiến ​​cho một thư viện cụ thể.

$ pkg-config --cflags --libs sdl2 
-D_THREAD_SAFE -I/usr/local/include/SDL2 -I/usr/X11R6/include -L/usr/local/lib -lSDL2 

$ gcc example.c $(pkg-config --cflags --libs sdl2) 

Nếu bạn đang sử dụng một Makefile, bạn cần phải thêm tiền tố lệnh với shell:

all: 
    gcc example.c $(shell pkg-config --cflags --libs sdl2) 
Các vấn đề liên quan