gcc不会编译SDL C程序(对SDL函数的未定义引用)

时间:2013-12-17 03:14:07

标签: c linux gcc sdl

我最近搬到了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;
}

5 个答案:

答案 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。