Newsgroup: it.comp.lang.c++
Titolo: errore compilazione con gcc

Salve a tutti .. stranamente in una classe da me fatta che prima 
funzionava, ho aggiunto un parametro ad una funzione che fa 
parte di questa classe, e' un parametro bool che ho aggiunto per 
gestire alcune funzionalita di questa funzione .. pero' adesso , 
quando vado a ricompilare il tutto mi da sempre questo errore :
In file included from cgidb.cpp:8:
lib/debug.lib.cpp:2: redefinition of `class MyDebug'
lib/debug.lib.cpp:2: previous definition of `class MyDebug'
make: *** [cgidb] Error 1
non capisco, anche avendo tolto il parametro che avevo aggiunto 
mi da sempre questo errore .. sapete aiutarmi ? 
Per essere preciso MyDebub e' una classe contenuta nel file 
debug.lib.cpp, e all'interno esiste una funzione che si chiama 
WriteLog al quale ho aggiunto un parametro un piu' che poi ho 
tolto  .. ma l'errore adesso rimane.
Grazie di tutto per qualsiasi risposta.
Mirco
-- 
Inviato da Virgilio 
http://newsgroup.virgilio.it
Filtra gli antipatici, segnala le risposte, segue i thread, e tutto da web

 mi da sempre questo errore .. sapete aiutarmi ? 
dovresti postare un blocco di codice compilabile che esibisca il 
problema, altrimenti così la vedo dura.
-- 
Barcollo ma non mollo!

Ok .. scusami hai ragione, e' che non volevo appesantire troppo 
il ng , questa e' la piccola classe con i due metodi.Quello che 
ho fatto prima che succedesse il problema, e' aggiungere un 
parametro bool al metodo writelog, che poi ho tolto.Quindi ho 
aggiunto il parametro bool, ho richiamato la classe ed il suo 
metodo da un'altra classe in questo modo :
MyDebug Debug;
Debug.WriteLog ("Prova","Prova",false);
da questo momento ricompilando mi da quell'errore.anche avendo 
tolto il parametro che avevo aggiunto e togliendo la chiamata 
alla classe debug dal resto del progetto.Spero tu possa mi possa 
aiutare.(abbi pazienza per il codice .. scrivo in c++ da 
pocissimo).. ciao e grazie!!!
#include <iostream>
class MyDebug
{
        public:
                void WriteMainLog (std::string);
                void WriteLog (std::string, std::string);
};
void MyDebug::WriteMainLog (std::string sType)
{
        if (sType == "START")
        {
 
cout<<"\n********************************************"<<endl;
                cout<<"*************** START C MAIN 
***************"<<endl;
 
cout<<"********************************************\n"<<endl;
        }
        if (sType == "END")
        {
 
cout<<"\n********************************************"<<endl;
                cout<<"***************  END C MAIN  
***************"<<endl;
 
cout<<"********************************************\n"<<endl;
        }
}
void MyDebug::WriteLog (std::string sSection, std::string 
sContent)
{
    if (sSection == "HEADER")
    {
        cout<<"\n------------------------------------:"<<endl;
        cout<<"-->: "<<sContent<<" -->:"<<endl;
        cout<<"------------------------------------:"<<endl;
    }
    if (sSection == "FOOTER")
    {
        cout<<"\n------------------------------------:"<<endl;
        cout<<"--<: "<<sContent<<" --<:"<<endl;
        cout<<"------------------------------------:"<<endl;
    }
}
Fred Mammola e il Tempio di Sdenk Settemani Urrins ha scritto:



 [...]
Manca
#include <string>
EMG
--
EMAG Software Homepage:     
http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: 
http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: 
http://www.emagsoftware.it/tbosg

Mirco wrote:
 > [snip codice]
aggiungendo all'inizio:
using std::cout;
using std::endl;
io ho compilato senza problemi. Verifica.


Ragazzi, innanzi tutto grazie e perdonate la mia ignoranza ,, ma 
haime .. non funziona.
ho provato a fare quello che dice enrico e quello che mi dici 
tu, ho provato a ricompilare, pero' adesso se vado a 
referenziare quella determinata classe all'interno di un'altra 
(facendo appunto #include "lib/debug.lib.cpp"
quando compilo mi da il seguente errore:
[snake@mirco dev]$ make
g++ -Wno-deprecated -o cgidb cgidb.cpp -L./ -lmysqlclient
In file included from cgidb.cpp:9:
lib/debug.lib.cpp:7: redefinition of `class MyDebug'
lib/debug.lib.cpp:7: previous definition of `class MyDebug'
make: *** [cgidb] Error 1
Proprio non capisco, lui dice che devo ridefinire ? ma 
ridefinire cosa ? non ho fatto altro che aggiungere l'include di 
quella classe al main del progetto che e' la cgidb.cpp .. spero 
riusciate ad aiutarmi .. 
grazie .. mirco!!
Fred Mammola e il Tempio di Sdenk Settemani Urrins ha scritto:



 
le definizioni si mettono nel file .cpp, le dichiarazioni si mettono nei 
file .h, e poi si includono *solo* i file .h, non i .cpp come fai tu! 
Ecco dov'è l'errore!


Ti ringrazio, credo che dovro' studirami tutto il discorso degli 
include, ammesso che sia quello, perche' io sto' usando dei 
sorgenti fatti da qualcun'altro e stranamente la persona che che 
li ha creati ha inserito le librerie che ha sviluppato dentro le 
classi richiamandole con il loro percorso senza usare file 
*.h .. comunque e' meglio che mi vedo come costruire questi 
file .. perche' non ci sto capendo nulla .. tu sai dirmi dove 
posso trovare qualc'osa che possa aiutarmi ?
ciao e grazie!!!
Mirco
Fred Mammola e il Tempio di Sdenk Settemani Urrins ha scritto:



 posso trovare qualc'osa che possa aiutarmi ?
certo, su un qualsiasi testo decente di C++, ad esempio Thinking in C++ 
di Eckel che è liberamente scaricabile in rete 
(
http://www.mindview.net
). In più, credo che gli altri frequentatori di 
questo NG stiano preparando delle FAQ dove c'è scritto sicuramente 
qualcosa di più.
PS.: dovresti imparare anche qualcosa sul quoting.


Scusami se ti rompo .. ma mi potresti dire solo una cosa?quando 
compilo con il make mi dice che c'e' una problema nella riga 10 
del file che ti allego qui sotto.
questo e' il log del make :
[devrm@aco080l chat2_1]$ make
g++ -Wno-deprecated -o cgidb cgidb.cpp -L./ -lmysqlclient
In file included from cgidb.cpp:7:
lib/trace.lib.cpp:10: redefinition of `class MyDebug'
lib/trace.lib.cpp:10: previous definition of `class MyDebug'
Mi puoi dire cosa c'e' che non va nella riga 10 del file 
trace.lib.cpp che di seguito ti posto :
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string>
using namespace std;
using std::cout;
using std::endl;
class MyDebug
{ /* questa e' la riga 10 */
        public:
                void WriteMainLog(std::string);
                void WriteLog(std::string, std::string) ;
        private:
};
void MyDebug::WriteMainLog(std::string sType)
{
        if (sType == "START")
        {
 
cout<<"\n********************************************"<<endl;
                cout<<"*************** START C MAIN 
***************"<<endl;
 
cout<<"********************************************\n"<<endl;
        }
        if (sType == "END")
        {
 
cout<<"\n********************************************"<<endl;
                cout<<"***************  END C MAIN  
***************"<<endl;
 
cout<<"********************************************\n"<<endl;
        }
}
void MyDebug::WriteLog(std::string sSection, std::string 
sContent)
{
        if (sSection == "HEADER")
        {
                cout<<"\n------------------------------------
:"<<endl;
                cout<<"-->: "<<sContent<<" -->:"<<endl;
                cout<<"------------------------------------
:"<<endl;
        }
        if (sSection == "FOOTER")
        {
                cout<<"\n------------------------------------
:"<<endl;
                cout<<"--<: "<<sContent<<" --<:"<<endl;
                cout<<"------------------------------------
:"<<endl;
        }
        if (sSection == "BODY")
        {
                cout<<" - "<<sContent<<endl;
        }
}
GRAZIE PER L'AIUTO!!!!
MIRCO
Fred Mammola e il Tempio di Sdenk Settemani Urrins ha scritto:



 trace.lib.cpp che di seguito ti posto :
 > [snip]
Non c'è niente che non vada nel codice in se. Il fatto è che se il 
compilatore trova due definizioni identiche si lamenta e ti da' un 
messaggio di errore. A questo poni rimedio facendo quello che ti dicevo 
nell'altro post, ovvero scorporando definizioni e dichiarazioni in, 
rispettivamente, un file .cpp e un file .h e poi includendo il file .h 
dove necessario.


Ok, funziona!!!!
Per il momento ho risolto mettendo in alto alla classe che viene 
richiamata in piu' parti la seguente riga :
#ifndef NOME_CLASSE
#define NOME_CLASSE 
in questo modo non la chiamo se e' gia' presente in memoria, 
comunque nel frattempo mi sto organizzando con mettere tutto in 
un file *.h e poi referenziare questo file quando serve, come 
giustamente mi dicevi tu .. 
ti ringrazio di tutto.
Ciao
Mirco
Fred Mammola e il Tempio di Sdenk Settemani Urrins ha scritto:



 giustamente mi dicevi tu .
Peraltro anche quando li tieni in .h ( o .hh ) le 'sentinelle' (gli #ifndef
e compagnia) ci vanno
-- 
[ RiK0                                ]
[ non credo negli schemi non vincenti ]
[ two is an odd prime number          ]