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

瘦欲@ 提交于 2019-12-01 22:03:28
Basile Starynkevitch

Order of arguments to gcc matters a lot. 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 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)

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
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!