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!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2007-11-26 21:05:04

  kresek - Użytkownik

kresek
Użytkownik
Zarejestrowany: 2007-03-24

Cpp i plik nagłówkowy

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

Kod:

#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

Kod:

#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

Kod:

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:


Kod:

$ 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

 

#2  2007-11-26 22:30:14

  Matthew - Użytkownik

Matthew
Użytkownik
Skąd: Lipka/Gdańsk (PG)
Zarejestrowany: 2006-06-09
Serwis

Re: Cpp i plik nagłówkowy

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

 

#3  2007-11-27 18:27:01

  kresek - Użytkownik

kresek
Użytkownik
Zarejestrowany: 2007-03-24

Re: Cpp i plik nagłówkowy

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

Offline

 

#4  2007-11-27 20:37:53

  Matthew - Użytkownik

Matthew
Użytkownik
Skąd: Lipka/Gdańsk (PG)
Zarejestrowany: 2006-06-09
Serwis

Re: Cpp i plik nagłówkowy

kresek napisał(-a):

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

Dlatego ta książka powinna być zakazana.

Offline

 

#5  2007-11-27 20:57:34

  czadman - Bicycle repairman

czadman
Bicycle repairman
Skąd: Wrocław
Zarejestrowany: 2005-07-08

Re: Cpp i plik nagłówkowy

*.h

extern int zmienna1;
extern int zmienna2;

Właściwie nie czaję. Praktyka powszechnie stosowana w kodzie linuksa. Powinni go zakazać?


http://www.debian.org/logos/openlogo-nd-50.png

Offline

 

#6  2007-11-27 23:00:34

  kresek - Użytkownik

kresek
Użytkownik
Zarejestrowany: 2007-03-24

Re: Cpp i plik nagłówkowy

Już sobie poradziłem, przy kompilacji trzeba było postąpic inaczej :)

Kod:

$ 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

 

#7  2007-11-28 04:31:39

  kuchar - Użytkownik

kuchar
Użytkownik
Skąd: Warszawa
Zarejestrowany: 2005-11-16
Serwis

Re: Cpp i plik nagłówkowy

w takim przypadku najlepiej napisać makefile-a:

Kod:

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)


Linux Registered User # 406343

Routing protocols enable routers to route routed protocols :)

Offline

 

#8  2007-11-29 13:09:45

  giegiel - Członek DUG

giegiel
Członek DUG
Skąd: Chrzypsko Wielkie/Poznań
Zarejestrowany: 2006-04-15

Re: Cpp i plik nagłówkowy

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

 

#9  2007-11-29 13:51:13

  Matthew - Użytkownik

Matthew
Użytkownik
Skąd: Lipka/Gdańsk (PG)
Zarejestrowany: 2006-06-09
Serwis

Re: Cpp i plik nagłówkowy

"Język C++" a jak ktoś nie trawi tak mocnej pozycji to "C++ w 21 dni" (czy jakoś tak).

Offline

 

#10  2007-11-29 20:34:55

  zielkam - były zielony_83 :)

zielkam
były zielony_83 :)
Skąd: Zawiercie
Zarejestrowany: 2006-05-06
Serwis

Re: Cpp i plik nagłówkowy

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


Zostałeś zarejestrowany jako użytkownik #416423 przez.. :mrgreen:
##
FluxboxPL | Mój Lepszy Świat | UnixyPL | Telenia VOIP dla ISP
JID: zielony@jabster.pl

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
To nie jest tylko forum, to nasza mała ojczyzna ;-)