Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: SDL-linkitysvirhe

Sivun loppuun

Lumi-ukkeli [28.03.2006 16:45:43]

#

//main.cpp

void AlustaKaikki();
void Terminoi();
//#include <SDL/SDL.h>

int main (int argc, char *argv[])
{
    AlustaKaikki();
    Terminoi();
    return 0;
}




//graphics.cpp

#include <SDL/SDL.h>
#include <iostream>
using namespace std;

SDL_Surface* Screen;

void AlustaKaikki()
{
    SDL_Init(SDL_INIT_VIDEO);
    Screen = SDL_SetVideoMode(1024, 768, 32, SDL_FULLSCREEN|SDL_DOUBLEBUF|SDL_HWSURFACE);
    if(Screen != NULL)
       cout << "Kaikki alustettu onnistuneesti";
}

void Terminoi()
{
     SDL_Quit();
}

Dev-C++ 4.9.9.2 antaa tuosta koodista huomautuksen:
C:\Dev-Cpp\lib\libSDLmain.a(SDL_main.o)(.text+0x35a) In function `console_main':
[Linker error] undefined reference to `SDL_main'

mutta jos tuolla main.cpp:ssä ei kommentoi #include <SDL/SDL.h> niin kaikki toimii. Miksi tuo pitää sisällyttää kahteen kertaan? Minun tietääkseni tuo yksi kerta pitäisi riittää. Joku meinasi että linkkerin parametrit ovat pielessä (-lmingw32 -lSDLmain -lSDL -liberty)

sooda [28.03.2006 16:54:05]

#

Tietääkseni tuo yksi parametri on -lSDL_main eikä -lSDLmain.

Lumi-ukkeli [28.03.2006 16:56:40]

#

cannot find -lSDL_main

Metabolix [28.03.2006 17:45:17]

#

Ongelma on siinä, että et ole includettanut SDL-otsikkoa sinne, missä main.cpp on. SDL tietääkseni muuttaa main-funktion SDL_main-funktioksi, ja nyt, kun sitä ei ole muutettu, sitä ei tietenkään löydy. Eli kommentointi pois includen edestä.

Kummankin funktioesittelyn eteen (main.cpp:ssä) kuuluisi vielä extern.

pistemies [28.03.2006 19:13:10]

#

sooda kirjoitti:

Tietääkseni tuo yksi parametri on -lSDL_main eikä -lSDLmain.

Minulla ainaski tuo kirjasto on libSDLmain.a eli pitää olla -lSDLmain
Entäs toi -liberty? Minulla ei tommoista kirjastoa ole, vaikka on SDL

Lumi-ukkeli [28.03.2006 20:36:43]

#

http://www.libsdl.org/faq.php?action=listentries­&category=7#55 :

Q: What is SDLMain.m? Do I need it? Why is _main undefined?
A: Just like main() is the entry point for C programs (inc. C++, Objective-C, and Objective-C++), SDL_main() is the main entry point for SDL programs. However, you don't actually write an SDL_main() function. The header file "SDL_main.h" remaps your main() function to the SDL_main() function with a function macro. Your SDL_main() function is called after the code in SDLMain.m has performed the required "bootstrap" initializations to support the SDL runtime.

There are three things you have to do:

1. You must include either SDLMain.m/.h or libSDLmain in your application, because this is the code that defines SDL's entry point. If you fail to do this, it is likely that "_main undefined" will be thrown by the linker.
2. You must give your main() procedure the following prototype:

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

3. You must make sure the file containing your main() procedure #includes SDL.h.

Otherwise, the macro will not remap main() to SDL_main(), you will get an undefined _main error, or the bootstrap process will not run, and SDL will behave strangely or your application will crash or hang.

outo juttu vaan että tuo on macille vaikka mulla on iha wintousa :D

pistemies [28.03.2006 20:48:34]

#

Eikö sinulla ole tuota kirjastoa?

Minä olen imuroinut Dev-cpp:lle tuolta:

http://ftp.citkit.ru/pub/sourceforge/d/de/dev-cpp/

Mikäli sinulla oli Dev-Cpp......

Tosin, kun menee yhden hakemiston verran tuolta ylöspäin, sieltä pääsee monelle muulleekin kääntäjälle lataamaan noita paketteja.

offtopic: Tosin osa paketeista voi olla osittain vanhentuneita, ilmeisesti ainakin tuo wxWindows, sen tilalle on tullut wxWidgets.

Lumi-ukkeli [28.03.2006 21:07:17]

#

On asennettu aivan oikein, ja mulla on dev-c++ 4.9.9.2. Mutta etkös sinä lukenut tuota lainausta? Siinähän nyt todistetaan tuo Metabolixin väite että tuo sdl tarvii sisällyttää tuonne main():in sisältävään sorsafilukkaan.

Metabolix [28.03.2006 21:48:42]

#

Jos jotakuta kiinnostaa käytännön toteutus asiassa, niin se menee jokseenkin näin:

// SDLmain.c eli se, jonka käännetty versio linkitetään mukaan parametrillä -lSDLmain

// Jostakin muualta tulee mukaan tällainen funktio
extern int SDL_main(int argc, char ** argv)

// Oikeasti ohjelma alkaa tästä:
int main(int argc, char ** argv)
{
  // Käynnistetään oikea ohjelma
  int RetVal = SDL_main(argc, argv);

  // Tässä välissä DEBUG-versiossa jotain omia tulostuksia
  // Ja sitten palautetaan palautusarvo
  return RetVal;
}
// SDL.h
// Määritellään, että main on SDL_main
#define main SDL_main
// main.cpp eli oma koodi

#include <SDL/SDL.h>

// SDL-otsikon define muuttaa seuraavan määrittelyn muotoon
// int SDL_main(int argc, char ** argv)
// jolloin SDL:n linkitetty, oikea main-funktio voi kutsua tätä nimellä SDL_main
int main(int argc, char ** argv)
{
  // Blah blah blah...
  return 0;
}

Grusifix [02.04.2006 20:01:30]

#

metabolix.respect++;


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta