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 [i]#include "nagl.h"[/i] z deklaracjami zmiennych i funkcji, całośc wygląda tak:

[b]plik1.cpp[/b]

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;
}

[b]plik2.cpp[/b]

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();
}

[b]nagl.h[/b]

Kod:

extern int zmienna1;
extern int zmienna2;

void f_pierwsza();
void f_druga();
void f_trzecia();
void f_czwarta();

po próbie skompilowania [i]g++ plik1.cpp -o plik1.o[/i], 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

[quote=kresek]Właściwie nie wymyślałem tego sam, podobny przykład jest w 'Symfonii C++' Jerzego Grębosza.[/quote]
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;[/quote]
Właściwie nie czaję. Praktyka powszechnie stosowana w kodzie linuksa. Powinni go zakazać?


[url=http://www.debian.org/][img]http://www.debian.org/logos/openlogo-nd-50.png[/img][/url]

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

[i]Routing protocols enable routers to route routed protocols[/i] :)

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:
##
[url=http://fluxboxpl.org]FluxboxPL[/url] | [url=http://zielony.fluxboxpl.org/blog/]Mój Lepszy Świat[/url] | [url=http://www.unixy.pl/]UnixyPL[/url] | [url=www.adescom.pl]Telenia VOIP dla ISP[/url]
JID: zielony@jabster.pl

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
Możesz wyłączyć AdBlock — tu nie ma reklam ;-)

[ Generated in 0.015 seconds, 11 queries executed ]

Informacje debugowania

Time (s) Query
0.00011 SET CHARSET latin2
0.00004 SET NAMES latin2
0.00166 SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='3.14.11.50' WHERE u.id=1
0.00097 UPDATE punbb_online SET logged=1716100714 WHERE ident='3.14.11.50'
0.00060 SELECT * FROM punbb_online WHERE logged<1716100414
0.00055 SELECT topic_id FROM punbb_posts WHERE id=76900
0.00179 SELECT id FROM punbb_posts WHERE topic_id=9841 ORDER BY posted
0.00220 SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=9841 AND t.moved_to IS NULL
0.00009 SELECT search_for, replace_with FROM punbb_censoring
0.00166 SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=9841 ORDER BY p.id LIMIT 0,25
0.00140 UPDATE punbb_topics SET num_views=num_views+1 WHERE id=9841
Total query time: 0.01107 s