Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Użytkownik

Otóż jestem początkującym 'programistą' amatorem :)
I chciałem skompilować programik składający się z kilku plików w każdym z nich dodałem #include "nagl.h" z deklaracjami zmiennych i funkcji, całośc wygląda tak:
plik1.cpp
#include <iostream>
#include "nagl.h"
using namespace std;
int zmienna2=9;
int main()
{
cout << "Poczatek\n";
f_trzecia();
f_czwarta();
cout << "Koniec\n";
}
void f_pierwsza()
{
cout << "Funkcja pierwsza\n";
cout << "zmienna2= " << zmienna2
<< " zmienna1= " << zmienna1;
}
void f_druga()
{
cout << "Funkcja druga\n";
cout << "zmienna2= " << zmienna2
<< " zmienna1= " << zmienna1;
}plik2.cpp
#include <iostream>
#include "nagl.h"
using namespace std;
int zmienna1=8;
void f_trzecia()
{
cout << "Funkcja trzecia\n";
cout << "zmienna2= " << zmienna2
<< " zmienna1= " << zmienna1;
f_pierwsza();
}
void f_czwarta()
{
cout << "Funkcja czwarta\n";
cout << "zmienna2= " << zmienna2
<< " zmienna1= " << zmienna1;
f_druga();
}nagl.h
extern int zmienna1; extern int zmienna2; void f_pierwsza(); void f_druga(); void f_trzecia(); void f_czwarta();
po próbie skompilowania g++ plik1.cpp -o plik1.o, otrzymuję taki komunikat:
$ g++ plik1.cpp -o plik1.o /tmp/ccJJ2fHJ.o: In function `f_druga()': plik1.cpp:(.text+0x19a): undefined reference to `zmienna1' /tmp/ccJJ2fHJ.o: In function `f_pierwsza()': plik1.cpp:(.text+0x206): undefined reference to `zmienna1' /tmp/ccJJ2fHJ.o: In function `main': plik1.cpp:(.text+0x27a): undefined reference to `f_trzecia()' plik1.cpp:(.text+0x27f): undefined reference to `f_czwarta()' collect2: ld returned 1 exit status
I tu moje pytanie, o co chodzi? Będę wdzięczny za jakiekolwiek wskazówki.
Offline


Użytkownik
W nagłówku daj same funkcje a w plikach poszczególnych zmienne. Wtedy w drugim pliku dajesz extern. W ogóle zabrałeś i zrobiłeś to od dupy strony.
W nagłówku powinny być tylko deklaracje, w plik1.cpp tylko main w plik2.cpp definicje funkcji i zmiennych. A najlepiej w main zmienne (bo nie powinny być zmienne globalne).
Offline
Użytkownik

Właściwie nie wymyślałem tego sam, podobny przykład jest w 'Symfonii C++' Jerzego Grębosza.
Offline


Użytkownik





Bicycle repairman






*.h
extern int zmienna1;
extern int zmienna2;
Właściwie nie czaję. Praktyka powszechnie stosowana w kodzie linuksa. Powinni go zakazać?
Offline
Użytkownik

Już sobie poradziłem, przy kompilacji trzeba było postąpic inaczej :)
$ g++ -c plik1.cpp plik2.cpp $ g++ -o plik_wykonalny *.o
I program działa jak powinien :)
Ostatnio edytowany przez kresek (2007-11-27 23:01:21)
Offline

Użytkownik
w takim przypadku najlepiej napisać makefile-a:
program: plik1.o plik2.o
g++ plik1.o plik2.o -o program
plik1.o: plik1.cpp nagl.h
g++ -c plik1.cpp
plik2.o: plik2.cpp nagl.h
g++ -c plik2.cppa pozniej tylko make i juz
Ostatnio edytowany przez kuchar (2007-11-28 04:32:04)
Offline



Członek DUG




Ja tam lubię tą książkę ;D i jadę ją równolegle z "Thinking in C++" ;D Symfonia jest przystępniejsza :) to jaką polecacie książkę skoro Symfonie zakazać, wycofać i spalić??
Offline


Użytkownik


były zielony_83 :)
Ja ostatnio wziąłem się za "Linux Programowanie" Neil Matthew. Bardzo fajna książka polecam. :)
Offline