我最近搬到了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;
}
答案 0 :(得分:7)
gcc
的参数顺序非常重要。取代
gcc `sdl-config --libs` -o main main.o
与
gcc main.o `sdl-config --libs` -o main
更好的是,了解如何使用GNU make并使用受this answer启发的Makefile
...
此外,始终将-Wall -g
传递给gcc
,直到您的程序无错误(然后使用-Wall -O2
)
答案 1 :(得分:5)
使用gcc compile命令添加-lSDL
。这将添加sdl库。在编译之前安装sdl开发包。
修改强>
gcc -o out main.c -lSDL
或
gcc -I/usr/include/SDL/ main.c -o out -L/usr/lib -lSDL
答案 2 :(得分: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
这不是解决方案,但可以让您专注于真正的问题,我认为这不是编译过程。
答案 3 :(得分:0)
非常感谢您的建议!这帮助我解决了一个关于在Linux下从未发现过的SDL符号的古老谜团:-)正如评论中所述,gcc行的顺序是必不可少的。 makefile编写得不好,这导致了你提到的破坏。
总结一下,使用:gcc(flags)-o name(include et linking options)
最后但并非最不重要的是,在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
答案 4 :(得分:0)
该问题的“普遍”答案中没有一个是正确的或有效的。他们中有些人甚至与所提问题无关。我有同样的问题。
SDL文档提供了这样的编译示例:gcc -o main main.c `sdl2-config --cflags --libs`
但用户建议这是导致问题的参数顺序!!它不是!实际上,他们建议的顺序是我以前从未见过的,当然也不是任何标准。此站点上的SDL答案的质量很低!
更新: 我找到了一些缺少功能的解决方案。 SDL2中不存在SDL_SetVideoMode。使用SDL_CreateWindow。