簡體   English   中英

gcc 不會編譯 SDL C 程序(對 SDL 函數的未定義引用)

[英]gcc won't compile SDL C Program (undefined reference to SDL functions)

我最近搬到了 linux,我在使用 gcc 編譯 SDL C 程序時遇到了問題。

我正在使用的命令:

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

即使通過分離 sdl-config 標志:

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;
}

gcc的參數順序很重要。

閱讀關於調用 GCC (以及gcc使用的binutils文檔)。 然后更換

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

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

更好的是,學習如何使用GNU make (它通常使用GNU bash )並使用受此答案啟發的Makefile ...

此外,始終將-Wall -g傳遞給gcc直到您的程序沒有錯誤(然后使用-Wall -O2

使用SDLgithubgitlab上的開源程序中獲取靈感。 還可以考慮使用其他開源庫和框架,例如QtSFMLGTKmm等……並研究它們的示例代碼。

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

編輯:

gcc -o out main.c -lSDL

或者

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

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

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

還要檢查這個: nm /usr/lib/i386-linux-gnu/libSDL.a | grep SDL_SetMainReady

這不是解決方案,但可以讓您專注於真正的問題,我認為這不是編譯過程。

非常感謝您的建議! 這幫助我解決了一個關於在 Linux 下從未發現的 SDL 符號的古老謎團 :-) 正如評論中所寫,gcc 行的順序是必不可少的。 生成文件寫得不好,這導致了您提到的損壞。

作為總結,使用: gcc ( flags ) -o name ( 包括 et 鏈接選項)

最后但並非最不重要的是,在 x86_64 下,使用 gdb64,而不是 gdb(是下一個頭痛;-)

例如,我自己寫的一個小 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 $@  $^ -I${INCLUDE_DIR} ${LDFLAGS} 

${FILENAME}${DEBUG_SUFFIX}: ${OBJS}
    ${CC} ${CFLAGS} ${CFLAGS_DEBUG} -o $@ $^ -I${INCLUDE_DIR} ${LDFLAGS} 

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

這個問題的“流行”答案都不是正確的或有效的。 其中一些甚至與提出的問題無關。 我也有同樣的問題。

SDL 文檔給出了這樣編譯的示例: gcc -o main main.c `sdl2-config --cflags --libs`

然而,用戶建議這是導致問題的參數順序!! 它不是! 事實上,他們建議的順序是我以前從未見過的,當然不是任何一種標准。 此站點上的 SDL 答案質量非常低!

更新:我找到了一些缺失功能的解決方案。 SDL_SetVideoMode 在 SDL2 中不存在。 使用 SDL_CreateWindow。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM