2013-12-17 111 views
3

我最近搬到了linux,而我在使用gcc編譯SDL C程序時遇到了問題。gcc不會編譯SDL C程序(對SDL函數的未定義引用)

我使用的命令:

gcc `sdl-config --cflags --libs` -o main main.c 

即使通過SDL分隔條件,配置標誌:

gcc `sdl-config --cflags` -c main.c 
gcc `sdl-config --libs` -o main main.o 

我得到了同樣的錯誤:

/tmp/ccHYyjKd.o: In function `main': 
main.c:(.text+0xe): undefined reference to `SDL_SetMainReady' 
main.c:(.text+0x18): undefined reference to `SDL_Init' 
main.c:(.text+0x31): undefined reference to `SDL_SetVideoMode' 
main.c:(.text+0x54): undefined reference to `SDL_MapRGB' 
main.c:(.text+0x6b): undefined reference to `SDL_FillRect' 
main.c:(.text+0x77): undefined reference to `SDL_Flip' 
main.c:(.text+0x83): undefined reference to `SDL_WaitEvent' 
main.c:(.text+0x90): undefined reference to `SDL_Quit' 
collect2: error: ld returned 1 exit status 

我很簡單的程序:

#include <stdio.h> 
#include <stdlib.h> 
#define SDL_MAIN_HANDLED 
#include <SDL/SDL.h> 

int main() 
{ 
    // SDL Initialize 
    SDL_SetMainReady(); 
    SDL_Init(SDL_INIT_VIDEO); 

    // Screen Initialize 
    SDL_Surface *screen = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE); 
    Uint32 screenColor = SDL_MapRGB(screen->format, 255, 255, 255); 
    SDL_FillRect(screen, NULL, screenColor); 
    SDL_Flip(screen); 

    // Main Program Loop 
    SDL_Event event; 
    do 
    { 
     SDL_WaitEvent(&event); 
    } while (event.type != SDL_QUIT); 

    // SDL Quit 
    SDL_Quit(); 

    return 0; 
} 

回答

5

的參數以gcc是相當重要的。更換

gcc `sdl-config --libs` -o main main.o 

gcc main.o `sdl-config --libs` -o main 

更重要的是,學會如何使用GNU make和使用Makefile通過this answer啓發......

而且,總是傳遞-Wall -ggcc,直到你的程序是錯誤 - 免費(然後使用-Wall -O2

4

使用gcc編譯命令添加-lSDL。這將添加sdl庫。在編譯之前安裝sdl開發包。

編輯:

gcc -o out main.c -lSDL 

gcc -I/usr/include/SDL/ main.c -o out -L/usr/lib -lSDL 
+0

我得到這個錯誤'在/ usr /斌/勞工處:找不到-lsdl' – rullof

+0

你安裝sdl開發包?你使用哪種操作系統? – sujin

+0

是的,我做到了。我如何檢查它是否安裝成功? – rullof

1

我看到這從/ usr /include/SDL2/SDL_main.h

/* *這由真正的SDL主​​函數調用,以讓其餘的 *庫知道初始化已正確完成。 * *在不知道自己在做什麼的情況下調用此函數會導致 *崩潰,並且難以診斷應用程序的問題。 */ extern DECLSPEC void SDL_SetMainReady(void);

另請選擇: nm /usr/lib/i386-linux-gnu/libSDL.a | grep SDL_SetMainReady

這不是解決方案,但會讓你專注於真正的問題,我認爲這不是編譯過程。

0

非常感謝您的建議!這幫助我解決了在Linux下從未發現過的SDL符號的一個古老祕密:-)正如註釋中所指出的那樣,gcc行的順序是必不可少的。 makefile文件寫得不好,導致你提到的破損。

作爲總結,用途:GCC(標誌)-o名(包括等鏈接選項)

最後但並非最不重要的,在x86_64的,使用gdb64,而不是GDB(是下一個headhache ;-)

作爲例子,一個小的Makefile我寫我自己(好吧,不是很好,但工程)

# Makefile pour le contrôle du robot Arduino 
# Controle Robot 
# Sauf mention contraire, tout est place sous Licence GPL V2 
# Historique : 
# Etienne HAMON/création du makefile initial (d'après cours IFT1), Novembre 2014 
# 
# Corrections du Makefile : Eric Bachard décembre 2014 

CC = gcc 
C_STANDARD = -std=c99 
INCLUDE_DIR = inc -I/usr/include/SDL 
SOURCES_DIR = sources 
BUILD_DIR = build 
APPLICATION_NAME = Controle 
FILENAME = ${BUILD_DIR}/${APPLICATION_NAME} 
CFLAGS = -Wall -ansi ${C_STANDARD} 
LDFLAGS = -lSDL $(sdl-config --static-libs) -lm 
DEBUG_SUFFIX = _debug 
CFLAGS_DEBUG = -v -gdwarf-2 -DDEBUG 
OBJS = ${SOURCES_DIR}/*.c 

all : ${FILENAME} ${FILENAME}${DEBUG_SUFFIX} 

${FILENAME}: ${OBJS} 
    ${CC} ${CFLAGS} -o [email protected] $^ -I${INCLUDE_DIR} ${LDFLAGS} 

${FILENAME}${DEBUG_SUFFIX}: ${OBJS} 
    ${CC} ${CFLAGS} ${CFLAGS_DEBUG} -o [email protected] $^ -I${INCLUDE_DIR} ${LDFLAGS} 

clean: 
    ${RM} *.o ${FILENAME} ${FILENAME}${DEBUG_SUFFIX} 
    ${RM} -rf ${BUILD_DIR}/*.dSYM