![](/img/trans.png)
[英]Basic C SDL2 program won't work with TCC while it does work with GCC (Linux)
[英]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
)
使用SDL從github或gitlab上的開源程序中獲取靈感。 還可以考慮使用其他開源庫和框架,例如Qt 、 SFML 、 GTKmm等……並研究它們的示例代碼。
使用 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.