【问题标题】:gcc won't compile SDL C Program (undefined reference to SDL functions)gcc 不会编译 SDL C 程序(未定义对 SDL 函数的引用)
【发布时间】:2013-12-17 03:14:06
【问题描述】:

我最近迁移到 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;
}

【问题讨论】:

    标签: c linux gcc sdl


    【解决方案1】:

    gcc 的参数顺序很重要。

    了解Invoking GCC(以及binutils 的文档,gcc 使用)。然后替换

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

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

    更好的是,学习如何使用GNU make(通常使用GNU bash)并使用受this answer启发的Makefile...

    另外,始终将-Wall -g 传递给gcc,直到您的程序没有错误(然后使用-Wall -O2

    githubgitlab 上的开源程序中获取灵感,使用SDL 还可以考虑使用其他开源库和框架,例如QtSFML、@ 987654331@等...并学习他们的示例代码。

    【讨论】:

      【解决方案2】:

      使用 gcc 编译命令添加 -lSDL。这将添加 sdl 库。编译前安装sdl开发包。

      编辑:

      gcc -o out main.c -lSDL
      

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

      【讨论】:

      • 你安装了 sdl dev 包吗?您使用的是哪个操作系统?
      • 是的,我做到了。如何查看是否安装成功?
      • 您使用的是哪个操作系统?如果是 ubuntu,您可以从软件中心轻松查看。
      • 我有一个基于 ubuntu 的发行版。我可以访问突触包管理器
      • lsdl更改为lSDL
      【解决方案3】:

      我从 /usr/include/SDL2/SDL_main.h 看到这个

      /* * 这由真正的 SDL 主函数调用,以让其余的 * 库知道初始化已正确完成。 * * 在不知道自己在做什么的情况下自己调用它可能会导致 * 崩溃和难以诊断您的应用程序的问题。 */ extern DECLSPEC void SDL_SetMainReady(void);

      还要检查这个: nm /usr/lib/i386-linux-gnu/libSDL.a | grep SDL_SetMainReady

      这不是解决方案,但可以让您专注于真正的问题,我认为这不是编译过程。

      【讨论】:

        【解决方案4】:

        非常感谢您的建议!这帮助我解决了一个关于在 Linux 下从未发现的 SDL 符号的古老谜团 :-) 正如 cmets 中所写,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
        

        【讨论】:

          【解决方案5】:

          此问题的“流行”答案均不正确或有效。其中一些甚至与所提出的问题无关。我也有同样的问题。

          SDL 文档给出了这样一个编译示例:gcc -o main main.c `sdl2-config --cflags --libs`

          然而,用户建议这是导致问题的参数顺序!!它不是!事实上,他们建议的顺序是我以前从未见过的,当然也不是任何标准。此站点上的 SDL 答案质量非常低!

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

          【讨论】:

            猜你喜欢
            • 2013-06-07
            • 2015-07-28
            • 2017-01-24
            • 2015-11-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-05-21
            相关资源
            最近更新 更多