3

I'm having trouble compiling a program I wrote a while ago (when I used SDL 1.2). There are a number of definitions missing:

  • SDL_GetTicks()
  • SDL_FillRect()
  • SDL_SetVideoMode()
  • SDL_DisplayFormatAlpha()

and many many more.

These are the headers that I'm including:

#include <SDL.h>
#include "fractile.h"
#include "graphics.h"
#include "globals.h"
#include "math.h"
#include "math_custom.h"
#include "Windows.h"
#include <stdio.h>

This is the build log

-------------- Build: Debug in Fractile (compiler: GNU GCC Compiler)---------------

mingw32-gcc.exe -Wall -Wall -g -IC:\Users\ryjensen\Programs\SDL\SDL2-2.0.3\x86_64-w64-mingw32\include\SDL2 -IC:\Users\ryjensen\Programs\SDL\SDL2_ttf-2.0.12\x86_64-w64-mingw32\include\SDL2\ -IC:\Users\ryjensen\Programs\SDL\SDL2_image-2.0.0\x86_64-w64-mingw32\include\SDL2\ -c C:\Users\ryjensen\Programs\Fractile\fractile.c -o obj\Debug\fractile.o
C:\Users\ryjensen\Programs\Fractile\fractile.c: In function 'fractal_editor':
C:\Users\ryjensen\Programs\Fractile\fractile.c:366:4: warning: implicit declaration of function 'within_rect' [-Wimplicit-function-declaration]
mingw32-g++.exe -LC:\Users\ryjensen\Programs\SDL\SDL2-2.0.3\x86_64-w64-mingw32\lib -LC:\Users\ryjensen\Programs\SDL\SDL2_ttf-2.0.12\x86_64-w64-mingw32\lib -LC:\Users\ryjensen\Programs\SDL\SDL2_image-2.0.0\x86_64-w64-mingw32\lib -o bin\Debug\Fractile.exe obj\Debug\fractile.o obj\Debug\general_functions.o obj\Debug\graphics.o obj\Debug\main.o obj\Debug\math_custom.o  -lcomdlg32 -lmingw32 -lSDL2 -lSDL2_image -lSDL2_ttf -lmingw32 -lSDL2 -lSDL2_image -lSDL2_ttf   -mwindows
obj\Debug\fractile.o: In function `fractal_wobble':
C:/Users/ryjensen/Programs/Fractile/fractile.c:197: undefined reference to `SDL_GetTicks'
C:/Users/ryjensen/Programs/Fractile/fractile.c:207: undefined reference to `SDL_GetTicks'
obj\Debug\fractile.o: In function `fractal_editor':
C:/Users/ryjensen/Programs/Fractile/fractile.c:424: undefined reference to `SDL_FillRect'
C:/Users/ryjensen/Programs/Fractile/fractile.c:440: undefined reference to `SDL_FillRect'
C:/Users/ryjensen/Programs/Fractile/fractile.c:446: undefined reference to `SDL_FillRect'
C:/Users/ryjensen/Programs/Fractile/fractile.c:464: undefined reference to `SDL_FillRect'
obj\Debug\general_functions.o: In function `set_window_size':
C:/Users/ryjensen/Programs/Fractile/general_functions.c:82: undefined reference to `SDL_SetVideoMode'
obj\Debug\general_functions.o: In function `load_image':
C:/Users/ryjensen/Programs/Fractile/general_functions.c:102: undefined reference to `IMG_Load'
C:/Users/ryjensen/Programs/Fractile/general_functions.c:108: undefined reference to `SDL_DisplayFormatAlpha'
C:/Users/ryjensen/Programs/Fractile/general_functions.c:112: undefined reference to `SDL_FreeSurface'
obj\Debug\general_functions.o: In function `create_surface':
C:/Users/ryjensen/Programs/Fractile/general_functions.c:128: undefined reference to `SDL_CreateRGBSurface'
C:/Users/ryjensen/Programs/Fractile/general_functions.c:136: undefined reference to `SDL_DisplayFormatAlpha'
C:/Users/ryjensen/Programs/Fractile/general_functions.c:138: undefined reference to `SDL_FreeSurface'
obj\Debug\general_functions.o: In function `init':
C:/Users/ryjensen/Programs/Fractile/general_functions.c:144: undefined reference to `SDL_Init'
C:/Users/ryjensen/Programs/Fractile/general_functions.c:157: undefined reference to `SDL_WM_SetCaption'
obj\Debug\general_functions.o: In function `load_files':
C:/Users/ryjensen/Programs/Fractile/general_functions.c:181: undefined reference to `TTF_Init'
C:/Users/ryjensen/Programs/Fractile/general_functions.c:189: undefined reference to `TTF_OpenFont'
C:/Users/ryjensen/Programs/Fractile/general_functions.c:190: undefined reference to `TTF_OpenFont'
obj\Debug\general_functions.o: In function `clean_up':
C:/Users/ryjensen/Programs/Fractile/general_functions.c:207: undefined reference to `SDL_FreeSurface'
C:/Users/ryjensen/Programs/Fractile/general_functions.c:211: undefined reference to `SDL_Quit'
C:/Users/ryjensen/Programs/Fractile/general_functions.c:212: undefined reference to `TTF_Quit'
obj\Debug\general_functions.o: In function `print_red_box':
C:/Users/ryjensen/Programs/Fractile/general_functions.c:262: undefined reference to `SDL_FillRect'
obj\Debug\graphics.o: In function `apply_surface':
C:/Users/ryjensen/Programs/Fractile/graphics.c:55: undefined reference to `SDL_UpperBlit'
obj\Debug\graphics.o: In function `apply_text':
C:/Users/ryjensen/Programs/Fractile/graphics.c:64: undefined reference to `TTF_RenderText_Blended'
C:/Users/ryjensen/Programs/Fractile/graphics.c:69: undefined reference to `SDL_FreeSurface'
obj\Debug\graphics.o: In function `apply_surface_clips':
C:/Users/ryjensen/Programs/Fractile/graphics.c:84: undefined reference to `SDL_UpperBlit'
obj\Debug\graphics.o: In function `apply_outline':
C:/Users/ryjensen/Programs/Fractile/graphics.c:98: undefined reference to `SDL_FillRect'
C:/Users/ryjensen/Programs/Fractile/graphics.c:102: undefined reference to `SDL_FillRect'
C:/Users/ryjensen/Programs/Fractile/graphics.c:109: undefined reference to `SDL_FillRect'
C:/Users/ryjensen/Programs/Fractile/graphics.c:113: undefined reference to `SDL_FillRect'
obj\Debug\graphics.o: In function `gradient':
C:/Users/ryjensen/Programs/Fractile/graphics.c:172: undefined reference to `SDL_FillRect'
obj\Debug\graphics.o:C:/Users/ryjensen/Programs/Fractile/graphics.c:195: more undefined references to `SDL_FillRect' follow
obj\Debug\main.o: In function `SDL_main':
C:/Users/ryjensen/Programs/Fractile/main.c:83: undefined reference to `SDL_PollEvent'
C:/Users/ryjensen/Programs/Fractile/main.c:240: undefined reference to `SDL_Flip'
C:/Users/ryjensen/Programs/Fractile/main.c:241: undefined reference to `SDL_FillRect'
C:/Users/ryjensen/Programs/Fractile/main.c:246: undefined reference to `SDL_GetTicks'
c:/users/ryjensen/programs/codeblocks/mingw/bin/../lib/gcc/mingw32/4.7.1/../../../libmingw32.a(main.o):main.c:(.text.startup+0xa7): undefined reference to `WinMain@16'
collect2.exe: error: ld returned 1 exit status
Process terminated with status 1 (0 minute(s), 2 second(s))
37 error(s), 1 warning(s) (0 minute(s), 2 second(s))

Here is some relevant code from my project:

void fractal_wobble(struct fractalData *f, int wobbleEvent){
    int i;

    if(wobbleEvent==vw_evaluate){
        double wobbleAngle;
        for(i=0; i<f->numbVectors; i++){
            if(f->vects[i].period > 0){
                wobbleAngle = (2*PI*(SDL_GetTicks() - f->vects[i].wobbleStartTime))/f->vects[i].period;
                f->exits[i].x = f->vects[i].x = f->vects[i].xorig*(1.0 + f->vects[i].xWobble*cos(wobbleAngle));
                f->exits[i].y = f->vects[i].y = f->vects[i].yorig*(1.0 + f->vects[i].yWobble*sin(wobbleAngle));
            }
        }
    }


    if(wobbleEvent==vw_toggle){
        if(f->vects[currentVector].period == 0){
            f->vects[currentVector].wobbleStartTime = SDL_GetTicks();
            f->vects[currentVector].period = WOBBLE_DEFAULT_PERIOD;
            f->vects[currentVector].xorig = f->vects[currentVector].x;
            f->vects[currentVector].yorig = f->vects[currentVector].y;
            f->vects[currentVector].xWobble = WOBBLE_PERCENTAGE_OF_MAGNITUDE;
            f->vects[currentVector].yWobble = WOBBLE_PERCENTAGE_OF_MAGNITUDE;
        }
        else
            f->vects[currentVector].period = 0;
            f->exits[currentVector].x = f->vects[currentVector].x = f->vects[currentVector].xorig;
            f->exits[currentVector].y = f->vects[currentVector].y = f->vects[currentVector].yorig;

    }
}

I must be missing something really simple.

  • I've updated all of my include and lib directories.
  • I've updated all of my .dll files in my working directory.
  • I've updated all of my linker settings as well.

If I am able to figure it out myself, I will update this post with my solution.

Sam
  • 7,252
  • 16
  • 46
  • 65
Ryan Jensen
  • 207
  • 1
  • 9

2 Answers2

0

You can't just update SDL from 1.x to 2.x. There is no backward compatibility here. Some old functions were removed, some new functions were added.

BTW, you can find the 'migration guide' (from 1.x to 2.x) on the wiki.

HolyBlackCat
  • 78,603
  • 9
  • 131
  • 207
  • I have been looking at that migration guide, but it doesn't address all of my issues. I see that I'm going to have to re-work a lot of my surface stuff and screen functions, but it looks like the functions that I want to use (namely, SDL_FillRect() and SDL_GetTicks()) still exist in SDL 2. I've been perusing the SDL 2 wiki and [these functions are still listed there](https://wiki.libsdl.org/CategoryAPI) – Ryan Jensen Jun 05 '14 at 13:27
  • 1
    Oh. Maybe, you're linking SDL wrong way. What compiler and settings you're using? – HolyBlackCat Jun 05 '14 at 18:13
  • you are correct. I have posted an answer that explains what I did wrong. – Ryan Jensen Jun 06 '14 at 18:20
0

I just figured out why it was not compiling. I was linking to the 64-bit headers/libraries.

Here is exactly what I did to get SDL to work:

Use the follwoing linker settings: -lmingw32 -lSDL2main -lSDL2 -lwinmm

Search Directories:

Compiler

C:\Users\USERNAME\Programs\SDL\SDL2-2.0.3\i686-w64-mingw32\include\SDL2

C:\Users\USERNAME\Programs\SDL\SDL2_ttf-2.0.12\i686-w64-mingw32\include\SDL2

C:\Users\USERNAME\Programs\SDL\SDL2_image-2.0.0\i686-w64-mingw32\include\SDL2

Linker

C:\Users\USERNAME\Programs\SDL\SDL2-2.0.3\i686-w64-mingw32\lib

C:\Users\USERNAME\Programs\SDL\SDL2_ttf-2.0.12\i686-w64-mingw32\lib

C:\Users\USERNAME\Programs\SDL\SDL2_image-2.0.0\i686-w64-mingw32\lib

Make sure you have the "i686-w64-mingw32" folders selected for 32-bit compilation. The "x86_64-w64-mingw32" folders are for 64-bit compilation

Test Program: #include #include

int main(int argc, char *argv[]){


    return 0;
}

You should be able to compile this. This will allow you to ensure your linker/compiler settings are correct and that everything is where it should be.

Cheers, Jensen

Ryan Jensen
  • 207
  • 1
  • 9