4

I'm trying to compile a cmake project on my mac, but it depends on the SDL framework. I installed this framework and after cmake then reported to me libSDL was not found I set following export variables myself (as suggested by cmake):

export SDL_INCLUDE_DIR=/Library/Frameworks/SDL.framework/
export SDLIMAGE_LIBRARY=/Library/Frameworks/SDL_image.framework/
export SDLIMAGE_INCLUDE_DIR=/Library/Frameworks/SDL_image.framework/Headers

Now cmake does it job, but when I run make, I get the following message:

Mats-MBP:build mats$ make
Linking CXX executable SDLExample
Undefined symbols for architecture i386:
 "_main", referenced from:
     start in crt1.10.6.o
    (maybe you meant: _SDL_main)
ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status
make[2]: *** [src/SDLExample] Error 1
make[1]: *** [src/CMakeFiles/SDLExample.dir/all] Error 2
make: *** [all] Error 2

I get this for both i386 and x86_64. What did I forget?

EDIT: these are the file contents:

Mats-MBP:build mats$ cat ../src/main.cpp 
/**
 * @file main.cpp
 *
 * A simple example-program to help you out with using SDL for 2D graphics.
 *
 * @author przemek
 */

#include <iostream>
#include <stdexcept>
#include <SDL.h>
#include <SDL_image.h>

using namespace std;

int main(int argc, char* argv[]) {
    try {
        // Try to initialize SDL (for video)
        if (SDL_Init(SDL_INIT_VIDEO) != 0) {
            throw runtime_error("Couldn't init SDL video!");
        }
        // Create a double-buffered screen surface:
        SDL_Surface* screen = SDL_SetVideoMode(800, 600, 24, SDL_DOUBLEBUF/* |     SDL_FULLSCREEN*/);
        if (!screen) {
            throw runtime_error("Couldn't set SDL video mode!");
        }

        // Use SDL_image library to load an image:
        SDL_Surface* image = IMG_Load("image.png");
//      SDL_Surface* image = IMG_Load("image.tga");
        if (!image) {
            throw runtime_error(SDL_GetError());
        }

        // "Pump" SDL events like keyboard presses and get the keystate:
        SDL_PumpEvents();
        Uint8* keyState = SDL_GetKeyState(0);

        // loop until user presses escape:
        while (!keyState[SDLK_ESCAPE]) {
            // Display a game background:
        SDL_Rect src, dst;          // Source and destination rectangles
        src.x = 0;
        src.y = 0;
        src.w = image->w;
        src.h = image->h;
        dst.x = 100;
        dst.y = 50;
        dst.w = image->w;
        dst.h = image->h;
        // Copy the image from 'image' to 'screen' surface
        SDL_BlitSurface(image, &src, SDL_GetVideoSurface(), &dst);

        // Flip surfaces (remember: double-buffering!) and clear the back buffer:
        SDL_Flip(screen);
        SDL_FillRect(screen, 0, 0);

        // Get new keyboard state:
        SDL_PumpEvents();
        keyState = SDL_GetKeyState(0);
    }

    // Free the screen surface & quit SDL
    SDL_FreeSurface(screen);
    SDL_Quit();
} catch (runtime_error& e) {
    cout << e.what() << endl;
    SDL_Quit();
}

return 0;
}
Mats
  • 308
  • 1
  • 3
  • 10
  • 1
    what kind of thing are you trying to build? An app or a command line tool or something else? CMake is complaining about a missing `main` function. – Michael Dautermann Nov 15 '11 at 13:51
  • It's make that's doing the complaining, but thats about the same thing. I'm trying to compile an SDL example program, so I guess that would be a command line tool. (For the record, I do have a main function, and I don't see any calls to another main function.) – Mats Nov 15 '11 at 15:52
  • Look in that sample code and see if there's any "main" function defined. If there isn't, create one (and make sure it branches / jumps into whatever is true entry point of the sample code). – Michael Dautermann Nov 15 '11 at 15:54
  • Well, there is a main (I edited my previous comment, maybe you didn't see). It calls no other main functions as far as I can see. – Mats Nov 15 '11 at 16:16
  • 1
    In order for SDL to properly handle cross-platform development with differences of main definitions (mainly winmain) SDL utilizes SDLMain.lib. I am on my phone so I can't access my project to remember what you needed to do in CMake. Try opening the findsdl cmake module, and read the top comment on the file – Ramon Zarazua B. Nov 15 '11 at 16:58

2 Answers2

1

I solved it by removing the .framework and unset my export variables to this framework, and I used the source to ./configure, make, make install. I removed all cmake build files and cmade and made my project again and everything was solved.

(For compiling SDL on OS X Lion you need to ./configure --disable-assembly)

Mats
  • 308
  • 1
  • 3
  • 10
0

As Ramon said, you need to link to SDLmain.lib for many platforms. So have something like this in your CMakeLists.txt file.

link_libraries (
   ${SDL_LIBRARY}
   ${SDLIMAGE_LIBRARY} # if using SDL_image, obviously
   SDLmain # Sadly not included in SDL_LIBRARY variable
)

Here is a simple page for more information: http://content.gpwiki.org/index.php/SDL:Tutorials:Setup

Leif Andersen
  • 21,580
  • 20
  • 67
  • 100