Program skladajacy sie z dwoch plikow, problem: 'undefined reference to'

0

Witam. Jestem początkujący i właśnie przerabiam symfonie c++ Jerzego Grębosza. Zatrzymałem się na funkcjach, a ściślej na zadaniach z funkcji. Zgodnie z treścią zadania miałem napisać program, który składa się z dwóch plików ooraz
*każdy z plików powinien zawierać dwie funkcję
*każda funkcja powinna zostać wywołana
*w każdym pliku powinny być trzy zmienne typu int, double oraz char (łącznie 6 zmiennych)
Każda funkcja ma wypisywać te zmienne, później zmienić ich wartość i znowu wypisać na ekran, ale to akurat jest nie ważne.
Przejdźmy do istoty problemu.
Mam trzy pliki
plik1.cpp

#include <iostream>
#include "naglowek.h"
using namespace std;
int x = 1;
double y = 2.2;
char z = 'z';
void polska();
int main()
{
    cout << "-----JESTESMY U SIEBIE!-----\n";
    cout << "Zmienna x jest rowna: " << x << endl;
    cout << "Zmienna y jest rowna: " << y << endl;
    cout << "Zmienna z jest rowna: " << z;
    //ZMIANA ZMIENNYCH GLOBALNYCH
    x = 10;
    y = 22.2;
    z = 'b';
    cout << "\nTeraz:\nZmienna x jest rowna: " << x << endl;
    cout << "Zmienna y jest rowna: " << y  << endl;
    cout << "Zmienna z jest rowna: " << z;
    // WYWOLANIE FUNKCJI POLSKA()
    polska();
}

//**************************************

void polska()
{
    cout << "\n-----JESTESMY W POLSCE!-----\n";
    cout << "Zmienna x jest rowna: " << x << endl;
    cout << "Zmienna y jest rowna: " << y  << endl;
    cout << "Zmienna z jest rowna: " << z;
    //ZMIANA ZMIENNYCH GLOBALNYCH
    x = 100;
    y = 222.2;
    z = 'a';
    cout << "\nTeraz:\nZmienna x jest rowna: " << x << endl;
    cout << "Zmienna y jest rowna: " << y << endl;
    cout << "Zmienna z jest rowna: " << z;
    // WYWOLANIE FUNKCJI niemcy()
    niemcy();
}

//**************************************

plik2.cpp

#include <iostream>
#include "naglowek.h"
using namespace std;
int a = 30;
double b = 3.3;
char c = 'c';
void niemcy();
void anglia();
//*******************************************
void niemcy()
{

    cout << "-----JESTESMY W NIEMCZECH!-----\n";
    cout << "Zmienna a jest rowna: " << a << endl;
    cout << "Zmienna b jest rowna: " << b << endl;
    cout << "Zmienna c jest rowna: " << c;
    //ZMIANA ZMIENNYCH GLOBALNYCH
    a = 300;
    b = 23.3;
    c = 'd';
    cout << "\nTeraz:\nZmienna a jest rowna: " << a << endl;
    cout << "Zmienna b jest rowna: " << b  << endl;
    cout << "Zmienna c jest rowna: " << c;
    // WYWOLANIE FUNKCJI anglia()
    anglia();

}
//*******************************************

//*******************************************
void anglia()
{

    cout << "\n-----JESTESMY W ANGLII!-----\n";
    cout << "Zmienna a jest rowna: " << a << endl;
    cout << "Zmienna b jest rowna: " << b << endl;
    cout << "Zmienna c jest rowna: " << c;
    //ZMIANA ZMIENNYCH GLOBALNYCH
    a = 400;
    b = 43.3;
    c = 'o';
    cout << "\nTeraz:\nZmienna a jest rowna: " << a << endl;
    cout << "Zmienna b jest rowna: " << b  << endl;
    cout << "Zmienna c jest rowna: " << c;

}
//********************************************

oraz naglowek.h

#ifndef NAGLOWEK_H_INCLUDED
#define NAGLOWEK_H_INCLUDED
extern int x;
extern double y;
extern char z;
extern int a;
extern double b;
extern char c;
void polska();
void niemcy();
void anglia();

#endif // NAGLOWEK_H_INCLUDED

Gdy próbuje skompilować plik nr. 1 wyskakuje mi błąd
'undefined reference to 'niemcy()'
Męczę się i męczę i nie wiem co robię źle.. Już z jednym podobnym zadaniem dałem sobie spokój, bo błąd był podobny a ja nie umiałem znaleźć rozwiązania. Teraz jednak chce wiedzieć co jest nie tak, więc proszę o pomoc!
Z góry dziękuje :)

0

A jak kompilujesz? Bo jak na moje to powinno być:

g++ plik1.cpp plik2.cpp -o moj_program

0

A jak i czym to kompilujesz? Bo zapewne próbujesz to od razu kompilować do postaci wykonywalnej binarki a tego zrobić nie możesz.
Większość IDE sama takie problemy rozwiązuje kiedy masz wiele plików w projekcie, ot wszystkie są najpierw kompilowane do postaci maszynowej a potem linkowane wszystkie na raz.
Jeśli chcesz to kompilować z konsoli to:

  • albo kompilujesz wszystkie pliki razem, tzn np.
g++ plik1.cpp plik2.cpp ... -o binarka

Albo kompilujesz pliki osobno, ale do poziomu kodu maszynowego

g++ -c plik1.cpp -o maszynowy.o

A dopiero potem dopiero linkujesz wszystko i budujesz binarkę.

0

Jak już mówiłem, jestem początkujący - Mogę więc tylko powiedzieć, że mam Code::Blocks, w nim mam 3 pliki otwarte i jak jestem w tym, gdzie mam funkcje int main() to po prostu śmiało klikam f9.. Jak się domyślam tak to nie powinno wyglądać.. Wybaczcie 'zieloność' i proszę o jakąś instrukcję jak to powinienem zrobić :P

2

@zaVistic kliknij New -> Project, dodaj te 3 pliki do projektu jako źródła i voila.

0

Matko, rzeczywiście jestem tępy hehe
Dzięki wielkie! :)

0

Szkoda pisać nowy temat, skoro istnieje już taki to opisze swój problem. Tkwię w tym samym co autor, to samo zadanie do wykonania, lecz inny błąd:
http://scr.hu/0qk4l/5amow

jedna.cpp

#include <iostream>
#include "jedna.h"

using namespace std;


void polska()
{
    cout<<"";
}
 

jedna.h

#ifndef JEDNA_H_INCLUDED
#define JEDNA_H_INCLUDED


extern int zm1, zmm1;
extern double zm2, zmm2;
extern char zm3, zmm3;

void polska();


#endif

 

Nie mam już nerwów ani sił na to.. o co chodzi?!

1

To nie w tych plikach masz problem: http://ideone.com/nvPpK1

0

Nie rozumiem.. myślałem, że w pliku nagłówkowym jedynie deklarujemy, a nie definiujemy funkcje.

W symfonii jest taki o to przykład:

nagl.h

extern int ile_murzynow;
extern int ile_europejczykow;

void funkcja_egipska();
void funkcja_kenijska();
void funkcja_francuska();
void funkcja_niemiecka();

Jak widać są tylko deklaracje.. a definiuje dopiero w pliku .cpp i normalnie działa. Chciałem zrobić podobnie, ale oczywiście nie działa, nie mogę ogarnąć tego tematu :/

No i zapomniałem dodać, że mam jeszcze plik main.cpp, w którym jest już funkcja main(), w której chciałbym wywołać funkcje polska(). No ale jak skoro nie mogę jej zdefiniować w jedna.cpp

1

Pewnie nie dodałeś jeden.cpp do projektu. Jest jakiś powód dla którego bawisz się w nekromantę zamiast założyć własny wątek?

0

http://scr.hu/0qk4l/00ced
Dodany jak widać..

Podczas zakładania tematu wyskoczył mi w podpowiedziach ten, który jest podobny, więc..

2

Aha, no tak. Wróć do kursu, przeczytaj jak działa #include i dlaczego #include "foo.cpp" to nigdy¹ nie jest dobry pomysł.

¹ wyjątki wyjątki. Jak będziesz potrzebował to będziesz wiedział o co chodzi.

0

Teraz wszystko działa, taki głupi błąd haha :D Dzięki wielkie kq :)

A tak poza tym, to obecnie nie jest tam napisane dlaczego nie powinno się tego robić, ale oczywiście autor nie pisał #include "nazwa.cpp" kompletnie to przeoczyłem.

Jeszcze raz dzięki!

1 użytkowników online, w tym zalogowanych: 0, gości: 1