简体   繁体   中英

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

I recently moved to linux and i'm having an issue with compiling SDL C programs using gcc.

The command i'm using:

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

Even by seperating sdl-config flags:

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

I'm getting the same error:

/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

My very simple program:

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

Order of arguments to gcc matters a lot.

Read about Invoking GCC (and documentation of binutils , which gcc uses). Then replace

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

with

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

Better yet, learn how to use GNU make (it is often using GNU bash ) and use a Makefile inspired by this answer ...

Also, always pass -Wall -g to gcc until your program is bug-free (then use -Wall -O2 )

Take inspiration from open source programs on github or gitlab using SDL . Consider also using other open source libraries and frameworks, such as Qt , SFML , GTKmm , etc... And study their example code.

Add -lSDL with gcc compile command. This will add sdl library. Install sdl developement package before compiling.

EDIT:

gcc -o out main.c -lSDL

or

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

I See this from /usr/include/SDL2/SDL_main.h

/* * This is called by the real SDL main function to let the rest of the * library know that initialization was done properly. * * Calling this yourself without knowing what you're doing can cause * crashes and hard to diagnose problems with your application. */ extern DECLSPEC void SDL_SetMainReady(void);

Also check this: nm /usr/lib/i386-linux-gnu/libSDL.a | grep SDL_SetMainReady

This is not the solution but will allow you to focus on the real problem, I think it is not the compilation process.

Thanks a lot for the advices ! This helped me to solve an old mystery about SDL symbols never found under Linux :-) As wroten in the comments, the order of gcc line is essential. The makefile was not well written and this was causing the breakage you mentionned.

As summary, use : gcc ( flags ) -o name ( include et linking options)

Last but not least, under x86_64, use gdb64, instead of gdb ( was the next headhache ;-)

As example, a little Makefile I wrote myself (ok, not that good, but works)

# 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

None of the "popular" answers for this question are correct or working. Some of them have nothing to even do with the question being asked. I have the same problem.

SDL docs give an example for compiling like this: gcc -o main main.c `sdl2-config --cflags --libs`

Yet user is suggesting that it is order of arguments causing the problem!! It is not! In fact, their suggested order is something I have never seen before and is certainly not any kind of standard. SDL answers on this site are very low quality!

Update: I found a solution for some missing functions. SDL_SetVideoMode does not exist in SDL2. Use SDL_CreateWindow.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM