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/.
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
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
Właściwie nie wymyślałem tego sam, podobny przykład jest w 'Symfonii C++' Jerzego Grębosza.
Offline
*.h
extern int zmienna1;
extern int zmienna2;
Właściwie nie czaję. Praktyka powszechnie stosowana w kodzie linuksa. Powinni go zakazać?
Offline
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
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.cpp
a pozniej tylko make i juz
Ostatnio edytowany przez kuchar (2007-11-28 04:32:04)
Offline
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
Ja ostatnio wziąłem się za "Linux Programowanie" Neil Matthew. Bardzo fajna książka polecam. :)
Offline