[ Atlantic777 @ 29.06.2009. 18:19 ] @
Do sada sam koristio iskljucivo C# (MSVC#) pa sam se malo razmazio, a od nedavno sam presao na g++ i trudim se da radim iskljucivo pod linuxom (ubuntu) ali sam naisao na problem, a resenje mi treba poprilicno hitno. Trazio sam na forumima (kako ovom tako i na stranim) ali nisam pronasao adekvatno resenje. Ako je negde vec objasnjeno, zamolio bih vas da mi prosledite link. U literaturi koju imam ne mogu da pronadjem resenje, a necu stici da procitam kompletnu knjigu koju sam svakako vec poceo citati.

Do sada nisam imao potrebu da pisem svoje headere, klase sam uvek strpao u jedan .cpp fajl i to je to, a sada hocu da svoje klase odvojim u jedan header koji cu kasnije da ukljucim u vise programa.

Kako tacno treba da izgleda struktura header fajla? Samo kod ili su potrebne i pretprocesorkse direktive? (mislim na #ifdef i sl.) Da li i header treba kompajlirati? Kada kompajliram .h fajl, dobijem jos jedan .h.gch. Procitao sam da taj .h.gch fajl treba obrisati, ali ni to mi nije pomoglo.

Dakle, u jednom folderu imam prog.cpp i header.h fajlove. U prog.cpp imam "#include <header.h>". Ovo ne prolazi, kompajler prijavljuje gresku da ne moze da pronadje header. Sta dalje?
[ combuster @ 29.06.2009. 18:24 ] @
http://stackoverflow.com/quest...-include-path-for-gcc-in-linux
http://www.network-theory.co.uk/docs/gccintro/gccintro_22.html

Treba da dodas putanju header-a ako nije u default include direktorijumu...
[ Atlantic777 @ 29.06.2009. 19:04 ] @
Problem je bio u tome sto sam kompajler upucivao na folder a ne na fajl headera.

A one pretprocesorske direktive su tu da bi sprecile da se neka klasa definise vise puta, ako sam dobro shvatio.

E sada, nije mi bas najjasnije gde sam ovde vise puta definisao klasu.

header.h
Code:

class integer

     public:
     int i;
};


prog.cpp
Code:

#include "header.h"

int main() { return 0 };


komanda kojom kompajliram:
Code:
 g++ prog.cpp -include ./head.h 


i dobijam gresku:
Code:

head.h:1: error: redefinition of ‘class integer’
head.h:1: error: previous definition of ‘class integer’


Kada u header dodam #ifndef i ostalo onda radi.
Dakle kada mi header izgleda ovako:
Code:

#ifndef OBJECT_H
#define OBJECT_H
class integer{ 
    public:
    int i;
    };
#endif


I... da, ako jos neko bude imao problema s ovim, headere definitivno treba kompajlirati. :D
[ karas @ 01.07.2009. 20:25 ] @
Ne treba ti -include opcija pri pozivu jer ona inkluduje navedeni fajl, što uz direktivu #include u prog.cpp daje duplu inkluziju. Dakle, koristi
Code:

g++ prog.cpp


P.S.
Tek ako kompajler ne može da nađe zaglavlja u podrazumevanim putanjama, treba da mu to naznačiš ali preko -I (veliko i) opcije - i to samo putanju ne i sam fajl.
[ Atlantic777 @ 02.07.2009. 16:49 ] @
Evo sada radi i bez toga, ne znam zasto tada nije htelo... :)