Thread: Linker Problem (SDL)

  1. #1
    Registered User
    Join Date
    Aug 2012
    Posts
    3

    Linker Problem (SDL)

    Hi, I thought this would be a good place to ask this question and I have tried researching, but the fact is: I am stuck.

    I am trying to compile duke3d source code which has been ported for linux: Duke3D for Linux which includes an SVN repo.

    This requires the SDL libraries. All of these I do have in /usr/include/SDL

    Yet, when I run make I am getting this output all the time:

    Code:
    make -C buildengine
    make[1]: Entering directory `/home/rjd-324/duke3d/source/buildengine'
    gcc -o build -g -L/usr/lib/x86_64-linux-gnu -lSDL build.o bstub.o engine.o cache1d.o sdl_driver.o unix_compat.o a.o pragmas.o 
    sdl_driver.o: In function `setupmouse':
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:2074: undefined reference to `SDL_WM_GrabInput'
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:2075: undefined reference to `SDL_ShowCursor'
    sdl_driver.o: In function `init_new_res_vars':
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:360: undefined reference to `SDL_WM_SetCaption'
    sdl_driver.o: In function `output_surface_info':
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:287: undefined reference to `SDL_GetVideoInfo'
    sdl_driver.o: In function `root_sdl_event_filter':
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:818: undefined reference to `SDL_Quit'
    sdl_driver.o: In function `sdl_key_filter':
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:764: undefined reference to `SDL_WM_GrabInput'
    sdl_driver.o: In function `attempt_fullscreen_toggle':
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:570: undefined reference to `SDL_WM_GrabInput'
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:571: undefined reference to `SDL_ShowCursor'
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:586: undefined reference to `SDL_WM_ToggleFullScreen'
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:595: undefined reference to `SDL_GetVideoInfo'
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:611: undefined reference to `SDL_GetClipRect'
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:641: undefined reference to `SDL_ShowCursor'
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:643: undefined reference to `SDL_SetVideoMode'
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:680: undefined reference to `SDL_SetClipRect'
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:685: undefined reference to `SDL_ShowCursor'
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:639: undefined reference to `SDL_WM_GrabInput'
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:683: undefined reference to `SDL_WM_GrabInput'
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:650: undefined reference to `SDL_SetVideoMode'
    sdl_driver.o: In function `handle_events':
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:830: undefined reference to `SDL_PollEvent'
    sdl_driver.o: In function `_joystick_deinit':
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:910: undefined reference to `SDL_JoystickClose'
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:912: undefined reference to `SDL_QuitSubSystem'
    sdl_driver.o: In function `_joystick_init':
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:866: undefined reference to `SDL_Init'
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:872: undefined reference to `SDL_NumJoysticks'
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:868: undefined reference to `SDL_GetError'
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:879: undefined reference to `SDL_JoystickName'
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:890: undefined reference to `SDL_JoystickOpen'
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:897: undefined reference to `SDL_JoystickNumBalls'
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:897: undefined reference to `SDL_JoystickNumHats'
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:897: undefined reference to `SDL_JoystickNumButtons'
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:897: undefined reference to `SDL_JoystickNumAxes'
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:879: undefined reference to `SDL_JoystickName'
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:893: undefined reference to `SDL_GetError'
    sdl_driver.o: In function `_joystick_deinit':
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:910: undefined reference to `SDL_JoystickClose'
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:912: undefined reference to `SDL_QuitSubSystem'
    sdl_driver.o: In function `_joystick_update':
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:924: undefined reference to `SDL_JoystickUpdate'
    sdl_driver.o: In function `_joystick_axis':
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:934: undefined reference to `SDL_JoystickGetAxis'
    sdl_driver.o: In function `_joystick_hat':
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:944: undefined reference to `SDL_JoystickGetHat'
    sdl_driver.o: In function `_joystick_button':
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:952: undefined reference to `SDL_JoystickGetButton'
    sdl_driver.o: In function `set_splash':
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:1212: undefined reference to `SDL_RWFromFile'
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:1212: undefined reference to `SDL_LoadBMP_RW'
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:1217: undefined reference to `SDL_SetVideoMode'
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:1222: undefined reference to `SDL_UpperBlit'
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:1223: undefined reference to `SDL_Flip'
    sdl_driver.o: In function `set_sdl_renderer':
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:1174: undefined reference to `SDL_Init'
    sdl_driver.o: In function `output_sdl_versions':
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:1105: undefined reference to `SDL_Linked_Version'
    sdl_driver.o: In function `output_driver_info':
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:314: undefined reference to `SDL_VideoDriverName'
    sdl_driver.o: In function `set_sdl_renderer':
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:1177: undefined reference to `SDL_GetError'
    sdl_driver.o: In function `get_physical_resolutions':
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:1781: undefined reference to `SDL_GetVideoInfo'
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:1782: undefined reference to `SDL_ListModes'
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:1786: undefined reference to `SDL_ListModes'
    sdl_driver.o: In function `go_to_new_vid_mode':
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:444: undefined reference to `SDL_ClearError'
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:445: undefined reference to `SDL_SetVideoMode'
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:444: undefined reference to `SDL_ClearError'
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:445: undefined reference to `SDL_SetVideoMode'
    sdl_driver.o: In function `_setgamemode':
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:1658: undefined reference to `SDL_GetTicks'
    sdl_driver.o: In function `VBE_setPalette':
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:2029: undefined reference to `SDL_SetColors'
    sdl_driver.o: In function `setupmouse':
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:2074: undefined reference to `SDL_WM_GrabInput'
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:2075: undefined reference to `SDL_ShowCursor'
    sdl_driver.o: In function `handle_events':
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:830: undefined reference to `SDL_PollEvent'
    sdl_driver.o: In function `_nextpage':
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:2131: undefined reference to `SDL_UpdateRect'
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:2148: undefined reference to `SDL_GetTicks'
    sdl_driver.o: In function `go_to_new_vid_mode':
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:444: undefined reference to `SDL_ClearError'
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:445: undefined reference to `SDL_SetVideoMode'
    sdl_driver.o: In function `fillscreen16':
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:2263: undefined reference to `SDL_UnlockSurface'
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:2241: undefined reference to `SDL_LockSurface'
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:2263: undefined reference to `SDL_UnlockSurface'
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:2241: undefined reference to `SDL_LockSurface'
    sdl_driver.o: In function `drawline16':
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:2307: undefined reference to `SDL_LockSurface'
    sdl_driver.o: In function `clear2dscreen':
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:2472: undefined reference to `SDL_FillRect'
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:2472: undefined reference to `SDL_FillRect'
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:2472: undefined reference to `SDL_FillRect'
    sdl_driver.o: In function `handle_events':
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:830: undefined reference to `SDL_PollEvent'
    sdl_driver.o: In function `_idle':
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:2480: undefined reference to `SDL_Delay'
    sdl_driver.o: In function `inittimer':
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:2507: undefined reference to `SDL_ClearError'
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:2508: undefined reference to `SDL_AddTimer'
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:2512: undefined reference to `SDL_GetError'
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:2513: undefined reference to `SDL_Quit'
    sdl_driver.o: In function `uninittimer':
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:2522: undefined reference to `SDL_RemoveTimer'
    sdl_driver.o: In function `getticks':
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:2559: undefined reference to `SDL_GetTicks'
    sdl_driver.o: In function `_joystick_init':
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:901: undefined reference to `SDL_JoystickEventState'
    sdl_driver.o: In function `set_splash':
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:1226: undefined reference to `SDL_FreeSurface'
    sdl_driver.o: In function `setvmode':
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:1587: undefined reference to `SDL_QuitSubSystem'
    sdl_driver.o: In function `_uninitengine':
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:2054: undefined reference to `SDL_QuitSubSystem'
    sdl_driver.o: In function `uninitvesa':
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:2060: undefined reference to `SDL_QuitSubSystem'
    sdl_driver.o: In function `_updateScreenRect':
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:2117: undefined reference to `SDL_UpdateRect'
    sdl_driver.o: In function `drawline16':
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:2450: undefined reference to `SDL_UnlockSurface'
    sdl_driver.o: In function `go_to_new_vid_mode':
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:448: undefined reference to `SDL_GetError'
    /home/rjd-324/duke3d/source/buildengine/sdl_driver.c:451: undefined reference to `SDL_Quit'
    collect2: ld returned 1 exit status
    make[1]: *** [build] Error 1
    make[1]: Leaving directory `/home/rjd-324/duke3d/source/buildengine'
    make: *** [buildengine] Error 2
    When I run sdl-config --cflags --libs

    Code:
    -I/usr/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT
    -L/usr/lib/x86_64-linux-gnu -lSDL
    dpkg -l | grep sdl:

    Code:
    ii  libsdl1.2-dev                          1.2.14-6.4ubuntu3                       Simple DirectMedia Layer development files
    ii  libsdl1.2debian                        1.2.14-6.4ubuntu3                       Simple DirectMedia Layer
    I have also tried removing these packages and installing them through source instead, but the same issue arises.

    There are two makefiles, one in duke3d/source/ and another in duke3d/source/buildengine/
    Both of which are included.

    Thank you.
    Attached Files Attached Files
    Last edited by tregio; 08-25-2012 at 07:29 AM.

  2. #2
    and the hat of int overfl Salem's Avatar
    Join Date
    Aug 2001
    Location
    The edge of the known universe
    Posts
    39,666
    > gcc -o build -g -L/usr/lib/x86_64-linux-gnu -lSDL build.o bstub.o engine.o cache1d.o sdl_driver.o unix_compat.o a.o pragmas.o
    Try
    gcc -o build -g -L/usr/lib/x86_64-linux-gnu build.o bstub.o engine.o cache1d.o sdl_driver.o unix_compat.o a.o pragmas.o -lSDL

    That is, move the -lSDL to the end of the linker command line (in the makefile)

    Quote Originally Posted by man page
    -l namespec
    --library=namespec
    Add the archive or object file specified by namespec to the list of files to link. This option may be used any number of times. If namespec is of the form
    :filename, ld will search the library path for a file called filename, otherwise it will search the library path for a file called libnamespec.a.

    On systems which support shared libraries, ld may also search for files other than libnamespec.a. Specifically, on ELF and SunOS systems, ld will search a
    directory for a library called libnamespec.so before searching for one called libnamespec.a. (By convention, a ".so" extension indicates a shared library.) Note
    that this behavior does not apply to :filename, which always specifies a file called filename.

    The linker will search an archive only once, at the location where it is specified on the command line. If the archive defines a symbol which was undefined in some
    object which appeared before the archive on the command line, the linker will include the appropriate file(s) from the archive. However, an undefined symbol in an
    object appearing later on the command line will not cause the linker to search the archive again.

    See the -( option for a way to force the linker to search archives multiple times.

    You may list the same archive multiple times on the command line.

    This type of archive searching is standard for Unix linkers. However, if you are using ld on AIX, note that it is different from the behaviour of the AIX linker.
    If you dance barefoot on the broken glass of undefined behaviour, you've got to expect the occasional cut.
    If at first you don't succeed, try writing your phone number on the exam paper.

  3. #3
    Registered User
    Join Date
    Aug 2012
    Posts
    3
    Quote Originally Posted by Salem View Post
    > gcc -o build -g -L/usr/lib/x86_64-linux-gnu -lSDL build.o bstub.o engine.o cache1d.o sdl_driver.o unix_compat.o a.o pragmas.o
    Try
    gcc -o build -g -L/usr/lib/x86_64-linux-gnu build.o bstub.o engine.o cache1d.o sdl_driver.o unix_compat.o a.o pragmas.o -lSDL

    That is, move the -lSDL to the end of the linker command line (in the makefile)
    Thank you, that solved this issue. So the archive file was being searched too early. It needed to be searched after it knew about all the o files, first?

    Why would -lSDL be in that location in the first place?

    Thanks again.

  4. #4
    and the hat of int overfl Salem's Avatar
    Join Date
    Aug 2001
    Location
    The edge of the known universe
    Posts
    39,666
    Well in the makefile,
    SDL_LDFLAGS := $(shell sdl11-config --libs) -L.
    will expand into
    -L/usr/lib/x86_64-linux-gnu -lSDL

    You can see this for yourself just by typing sdl11-config --libs on the command line

    The problem comes here
    LDFLAGS += -g $(SDL_LDFLAGS)

    when you use it here
    $(BUILDEXE) : $(ENGINEDLL) $(BUILDOBJS)
    $(LINKER) -o $(BUILDEXE) $(LDFLAGS) $(BUILDOBJS) $(ENGINEDLL)


    What you need to do is separate the LDFLAGS from the SDL flags, say
    LDFLAGS += -g

    $(BUILDEXE) : $(ENGINEDLL) $(BUILDOBJS)
    $(LINKER) -o $(BUILDEXE) $(LDFLAGS) $(BUILDOBJS) $(ENGINEDLL) $(SDL_LDFLAGS)


    That way, the expansion of -L/usr/lib/x86_64-linux-gnu -lSDL appear at the end of the linker command line, after the list of object files has been seen by the linker.
    If you dance barefoot on the broken glass of undefined behaviour, you've got to expect the occasional cut.
    If at first you don't succeed, try writing your phone number on the exam paper.

  5. #5
    Registered User
    Join Date
    Aug 2012
    Posts
    3
    Quote Originally Posted by Salem View Post
    Well in the makefile,
    SDL_LDFLAGS := $(shell sdl11-config --libs) -L.
    will expand into
    -L/usr/lib/x86_64-linux-gnu -lSDL

    You can see this for yourself just by typing sdl11-config --libs on the command line

    The problem comes here
    LDFLAGS += -g $(SDL_LDFLAGS)

    when you use it here
    $(BUILDEXE) : $(ENGINEDLL) $(BUILDOBJS)
    $(LINKER) -o $(BUILDEXE) $(LDFLAGS) $(BUILDOBJS) $(ENGINEDLL)


    What you need to do is separate the LDFLAGS from the SDL flags, say
    LDFLAGS += -g

    $(BUILDEXE) : $(ENGINEDLL) $(BUILDOBJS)
    $(LINKER) -o $(BUILDEXE) $(LDFLAGS) $(BUILDOBJS) $(ENGINEDLL) $(SDL_LDFLAGS)


    That way, the expansion of -L/usr/lib/x86_64-linux-gnu -lSDL appear at the end of the linker command line, after the list of object files has been seen by the linker.
    Thank you for helping once more.

    This source code does not like AMD64 arch much. I have, instead, created a small virtual machine running 32bit os and this time when I run make - it went off without a problem - no need to modify the where abouts of flags. This VM: 10.10 x86 Ubuntu.

    Anyway, thanks for your help.

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. gcc linker problem
    By raczzoli in forum C Programming
    Replies: 2
    Last Post: 05-29-2011, 07:28 AM
  2. Linker problem I think
    By 6tr6tr in forum C++ Programming
    Replies: 5
    Last Post: 10-22-2008, 08:26 PM
  3. Linker Problem with Dev C++
    By Brownie in forum C++ Programming
    Replies: 2
    Last Post: 09-26-2008, 07:18 AM
  4. linker problem
    By newkidonthebloc in forum C++ Programming
    Replies: 4
    Last Post: 08-15-2008, 10:05 AM
  5. Visual Studio Linker problem or my problem?
    By OOPboredom in forum C Programming
    Replies: 2
    Last Post: 04-13-2004, 12:32 AM