Witam, to mój pierwszy post na tym forum.
Zakupiłem ebooka Magnum Opus C++ i uczę się z niego programowania w CPP. Jestem na stronie 219. W wielkim skrócie, robię teraz - zgodnie z przykładem w książce - program w kilku plikach z dwoma plikami w CPP (afryka.cpp i europa.cpp) i jednym plikiem nagłówkowym naglowek.h.
Mój kod:
naglowek.h:
extern int ile_pigmejow;
extern int ile_europejczykow;
void funkcja_etiopska();
void funkcja_kenijska();
void funkcja_francuska();
void funkcja_niemiecka();
afryka.cpp:
# include <iostream>
using namespace std;
#include "naglowek.h"
int ile_pigmejow = 9;
//**********************************************************************
int main()
{
cout << "Poczatek programu" << endl;
funkcja_francuska();
funkcja_niemiecka();
cout << "Koniec programu" << endl;
}
//**********************************************************************
void funkcja_etiopska()
{
cout << "Jestem w Abbis Abbebie (Afryka) " << endl;
cout << "Na świecie mam przyjaciol: " << ile_pigmejow << " Pigmejow i "
<< ile_europejczykow << " Europejczykow" << endl;
}
//**********************************************************************
void funkcja_kenijska()
{
cout << "Jestem w Nairobi (Afryka) " << endl;
cout << "Na świecie mam przyjaciol: " << ile_pigmejow << " Pigmejow i "
<< ile_europejczykow << " Europejczykow" << endl;
}
europa.cpp:
#include <iostream>
using namespace std;
#include "naglowek.h"
int ile_europejczykow = 8;
//**********************************************************************
void funkcja_francuska()
{
cout << "Jestem w Paryzu (Europa) " << endl;
cout << "Na świecie mam przyjaciol: " << ile_pigmejow << " Pigmejow i "
<< ile_europejczykow << " Europejczykow" << endl;
funkcja_etiopska();
}
//**********************************************************************
void funkcja_niemiecka()
{
cout << "Jestem w Berlinie (Europa) " << endl;
cout << "Na świecie mam przyjaciol: " << ile_pigmejow << " Pigmejow i "
<< ile_europejczykow << " Europejczykow" << endl;
funkcja_kenijska();
}
Nagłówek kompiluje mi się dobrze, ale obydwa podpliki w CPP już nie. Kiedy próbuję na ten przykład skompilować Afrykę otrzymuję następujący komunikat:
g++ -Wall -std=c++0x -o "afryka" "afryka.cpp" (w katalogu G:\Personal Data\My Folders\Programowanie\CPP\MagnusOpus\6)
C:\Users\SZYMON1\AppData\Local\Temp\ccnbCGZ6.o:afryka.cpp:(.text+0x3c): undefined reference to1\AppData\Local\Temp\ccnbCGZ6.o:afryka.cpp:(.text+0xa6): undefined reference tofunkcja_francuska()' C:\Users\SZYMON~1\AppData\Local\Temp\ccnbCGZ6.o:afryka.cpp:(.text+0x41): undefined reference to
funkcja_niemiecka()'
C:\Users\SZYMONile_europejczykow' C:\Users\SZYMON~1\AppData\Local\Temp\ccnbCGZ6.o:afryka.cpp:(.text+0x146): undefined reference to
ile_europejczykow'
C:/TDM-GCC-32/bin/../lib/gcc/mingw32/5.1.0/../../../../mingw32/bin/ld.exe: C:\Users\SZYMON~1\AppData\Local\Temp\ccnbCGZ6.o: bad reloc address 0x0 in section `.ctors'
C:/TDM-GCC-32/bin/../lib/gcc/mingw32/5.1.0/../../../../mingw32/bin/ld.exe: final link failed: Invalid operation
collect2.exe: error: ld returned 1 exit status
Kompilacja nie powiodła się
Korzystam z Geany i gcc na Windowsie 10.
Czy ktoś może mi powiedzieć co zrobiłem źle? Pierwszy raz programuję w więcej niż jednym pliku i jestem kompletnie zielony jeśli o to chodzi. Znaczy, tak jak na to patrzę to widzę, że pliki nie widzą mi swoich funkcji (?), ale przecież wszystko zrobiłem zgodnie z przykładem, więc czemu tak jest?
Program działa jeśli wszystkie funkcje - i deklaracje i definicje - oraz zmienne umieszczę w pliku nagłówkowym, w takim wypadku zostaje mi tylko jeden plik - afryka.cpp - który działa. Chyba jednak autorowi chodziło o nieco inne rozwiązanie? Zrobiłem coś nie tak?