Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Käännösvirhe, multiple definition of (SDL_Surface)

Eki++ [09.08.2013 16:13:22]

#

SDL-pikkupelini kääntyy muuten hyvin, mutta jokaista SDL_Surfacea kohden tulee 2 erroria:

(polku)\AppData\Local\Temp\cc8AGTvp.o:main.cpp:(.bss+0xc): multiple definition of (SDL_Surface)
(polku)\AppData\Local\Temp\ccugrdrj.o:functions.cpp:(.bss+0xc): first defined here

Ja loppuun:

collect2: ld returned 1 exit status

Surfaceja on yht. 6 jotka on määritelty headerissa (functions.hpp):

SDL_Surface *surfacen_nimi = NULL;

Ne saavat lopulliset arvonsa alustusfunktiossa (functions.cpp):

surfacen_nimi = lataa_kuva("kuvatiedosto.bmp", false); // Sama funktio kuin c++-pelioppaassa

Mikä mättää? Kielenä siis C++ ja kääntäjänä g++.

Teuro [09.08.2013 16:35:36]

#

Toivottavasti et liitä yhtään *.cpp tiedostoa muihin tiedostoihin se on väärin. Ainoastaan *.hpp tiedostot tulee liittää muihin tiedostoihin. Luultavasti myös muuttujien määrittely *.hpp tiedostossa on väärin, siellä pitäisi ainoastaan esitellä muuttujat.

Ongelmahan on lähinnä linkkausongelma, eikä niinkään käännöksestä johtuva.

//functions.hpp
SDL_Surface* surfacen_nimi;
extern SDL_Surface* toinen;

Sitten aikanaan funktiot.cpp:ä määrittelet nuo edellä esitellyt muuttujat.

//funktiot.cpp
#include "funktiot.hpp"

surfacen_nimi = lataa_kuva("kuvatiedosto.bmp", false);
SDL_Surface* toinen = lataa_kuva("toinen.bmp", true);

Toisaalta tarvitseeko noita pintoja esitellä, vai voisivatko ne olla funktiot.cpp tiedoston omia staattisia osia. Muualla ohjelmassa niitä ei pitäisi tarvita ollenkaan.

Eki++ [09.08.2013 16:52:39]

#

Kiitos, tuo surfacejen siirto samaan filuun ja muuttaminen stattiisiksi auttoi.

Metabolix [10.08.2013 11:01:53]

#

Sinun pitää lukea koodivinkki monen tiedoston käytöstä.

Vastaus

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

Tietoa sivustosta