Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2006
    Messaggi
    13

    [c++] error LINK2005

    Ciao il mio problema è il seguente:
    ho un header myAR.h nel quale definisco una classe.
    includo myAR.h in myAR.cpp dove sviluppo i metodi della classe
    includo myAR.h anche in main.cpp dove devo usare un'istanza della classe.

    Al momento della compilazione ottengo una sfilza dei seguenti errori:

    myAR.obj : error LNK2005: "public: __thiscall ARToolKitPlus::CameraImpl::CameraImpl(void)" (??0CameraImpl@ARToolKitPlus@@QAE@XZ) already defined in Main.obj

    ARToolKitPlus è una lib che includo da myAR.h per poter definire alcune variabili della classe.
    Cosa sbaglio?

    grazie

  2. #2

    Re: [c++] error LINK2005

    Originariamente inviato da fai
    Ciao il mio problema è il seguente:
    ho un header myAR.h nel quale definisco una classe.
    includo myAR.h in myAR.cpp dove sviluppo i metodi della classe
    includo myAR.h anche in main.cpp dove devo usare un'istanza della classe.

    Al momento della compilazione ottengo una sfilza dei seguenti errori:

    myAR.obj : error LNK2005: "public: __thiscall ARToolKitPlus::CameraImpl::CameraImpl(void)" (??0CameraImpl@ARToolKitPlus@@QAE@XZ) already defined in Main.obj

    ARToolKitPlus è una lib che includo da myAR.h per poter definire alcune variabili della classe.
    Cosa sbaglio?

    grazie
    Se le variabili le definisci in myAR.h, allora l'errore è proprio quello.

  3. #3
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    Dall'errore che leggo sembra che ci siano due versioni di

    codice:
    CameraImpl::CameraImpl(void)
    Forse volevi fare un overloading?
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2006
    Messaggi
    13
    no, nessun overloading. Ecco come sono i files:

    myAr.h
    codice:
    #ifndef _myAR_H
    #define _myAR_H
    
    #include <ARToolKitPlus/TrackerMultiMarkerImpl.h>
    
    class myAR{
    public:
    	MyLogger logger;
    
    	ARToolKitPlus::TrackerMultiMarker *tracker;
    	const ARToolKitPlus::ARMultiMarkerInfoT *artkpConfig;
    
    	bool artkpSetup(int w, int h);
    };
    #endif
    myAr.cpp
    codice:
    #include "myAR.h"
    
    bool myAR::ArtkpSetup(int w, int h){
    ...
    }
    main.cpp
    codice:
    #incude "myAR.h"
    
    int main...
    Di fatto includendo myAR.h sia in main.cpp che in myAR.pp ottengo l'errore. Se definisco tutta la classe nel myAR.h non ho più errori.
    Avete qualche idea?

  5. #5
    Originariamente inviato da fai
    no, nessun overloading. Ecco come sono i files:

    myAr.h
    codice:
    #ifndef _myAR_H
    #define _myAR_H
    
    #include <ARToolKitPlus/TrackerMultiMarkerImpl.h>
    
    class myAR{
    public:
    	MyLogger logger;
    
    	ARToolKitPlus::TrackerMultiMarker *tracker;
    	const ARToolKitPlus::ARMultiMarkerInfoT *artkpConfig;
    
    	bool artkpSetup(int w, int h);
    };
    #endif
    myAr.cpp
    codice:
    #include "myAR.h"
    
    bool myAR::ArtkpSetup(int w, int h){
    ...
    }
    main.cpp
    codice:
    #incude "myAR.h"
    
    int main...
    Di fatto includendo myAR.h sia in main.cpp che in myAR.pp ottengo l'errore. Se definisco tutta la classe nel myAR.h non ho più errori.
    Avete qualche idea?
    Prima di tutto: ArtkpSetup != artkpSetup quindi per come è adesso il codice non te lo può compilare.

    Poi, nel trasferire artkpSetup da myAR.h al myAR.cpp, hai fatto un clean del progetto? Magari non ti ricompilava il main.cpp (che quindi aveva la definizione di artkpSetup proveniente da myAR.h) e quando lo hai spostato in myAR.cpp ti ha ricompilato solo quello (duplicando quindi la definizione di artkpSetup).

  6. #6
    Utente di HTML.it
    Registrato dal
    Aug 2006
    Messaggi
    13
    Ciao,
    ovviamente artkSetup era scritto sagliato perchè ho scritto il codice solo per il forum.
    Ho fatto la seguente prova:

    in myAR.cpp c'è solamente
    codice:
    #include "myAR.h"
    ho provato a fare il cleen del progetto in quanto evidentemente il problema è che inserisce i simboli provenienti dalla libreria sia nel obj del mai che in quello di myAR. I simboli che definisco io non dannoerrori di redifinizione. infatti nella lista degli erori ho:

    codice:
    myAR.obj : error LNK2005: "public: __thiscall ARToolKitPlus::CameraImpl::CameraImpl(void)" (??0CameraImpl@ARToolKitPlus@@QAE@XZ) already defined in Main.obj
    myAR.obj : error LNK2005: "public: virtual __thiscall ARToolKitPlus::CameraImpl::~CameraImpl(void)" (??1CameraImpl@ARToolKitPlus@@UAE@XZ) already defined in Main.obj
    myAR.obj : error LNK2005: "public: virtual bool __thiscall ARToolKitPlus::CameraImpl::loadFromFile(char const *)" (?loadFromFile@CameraImpl@ARToolKitPlus@@UAE_NPBD@Z) already defined in Main.obj
    myAR.obj : error LNK2005: "public: virtual void __thiscall ARToolKitPlus::CameraImpl::observ2Ideal(float,float,float *,float *)" (?observ2Ideal@CameraImpl@ARToolKitPlus@@UAEXMMPAM0@Z) already defined in Main.obj
    myAR.obj : error LNK2005: "public: virtual void __thiscall ARToolKitPlus::CameraImpl::ideal2Observ(float,float,float *,float *)" (?ideal2Observ@CameraImpl@ARToolKitPlus@@UAEXMMPAM0@Z) already defined in Main.obj
    myAR.obj : error LNK2005: "public: virtual class ARToolKitPlus::Camera * __thiscall ARToolKitPlus::CameraImpl::clone(void)" (?clone@CameraImpl@ARToolKitPlus@@UAEPAVCamera@2@XZ) already defined in Main.obj
    myAR.obj : error LNK2005: "public: virtual bool __thiscall ARToolKitPlus::CameraImpl::changeFrameSize(int,int)" (?changeFrameSize@CameraImpl@ARToolKitPlus@@UAE_NHH@Z) already defined in Main.obj
    myAR.obj : error LNK2005: "public: virtual void __thiscall ARToolKitPlus::CameraImpl::logSettings(class ARToolKitPlus::Logger *)" (?logSettings@CameraImpl@ARToolKitPlus@@UAEXPAVLogger@2@@Z) already defined in Main.obj
    myAR.obj : error LNK2005: "public: __thiscall ARToolKitPlus::CameraAdvImpl::CameraAdvImpl(void)" (??0CameraAdvImpl@ARToolKitPlus@@QAE@XZ) already defined in Main.obj
    myAR.obj : error LNK2005: "public: virtual __thiscall ARToolKitPlus::CameraAdvImpl::~CameraAdvImpl(void)" (??1CameraAdvImpl@ARToolKitPlus@@UAE@XZ) already defined in Main.obj
    myAR.obj : error LNK2005: "public: virtual bool __thiscall ARToolKitPlus::CameraAdvImpl::loadFromFile(char const *)" (?loadFromFile@CameraAdvImpl@ARToolKitPlus@@UAE_NPBD@Z) already defined in Main.obj
    myAR.obj : error LNK2005: "public: virtual void __thiscall ARToolKitPlus::CameraAdvImpl::observ2Ideal(float,float,float *,float *)" (?observ2Ideal@CameraAdvImpl@ARToolKitPlus@@UAEXMMPAM0@Z) already defined in Main.obj
    myAR.obj : error LNK2005: "public: virtual void __thiscall ARToolKitPlus::CameraAdvImpl::ideal2Observ(float,float,float *,float *)" (?ideal2Observ@CameraAdvImpl@ARToolKitPlus@@UAEXMMPAM0@Z) already defined in Main.obj
    myAR.obj : error LNK2005: "public: virtual class ARToolKitPlus::Camera * __thiscall ARToolKitPlus::CameraAdvImpl::clone(void)" (?clone@CameraAdvImpl@ARToolKitPlus@@UAEPAVCamera@2@XZ) already defined in Main.obj
    myAR.obj : error LNK2005: "public: virtual bool __thiscall ARToolKitPlus::CameraAdvImpl::changeFrameSize(int,int)" (?changeFrameSize@CameraAdvImpl@ARToolKitPlus@@UAE_NHH@Z) already defined in Main.obj
    myAR.obj : error LNK2005: "public: virtual void __thiscall ARToolKitPlus::CameraAdvImpl::logSettings(class ARToolKitPlus::Logger *)" (?logSettings@CameraAdvImpl@ARToolKitPlus@@UAEXPAVLogger@2@@Z) already defined in Main.obj
    myAR.obj : error LNK2005: "public: class ARToolKitPlus::Camera * __thiscall ARToolKitPlus::CameraFactory::createCamera(char const *)" (?createCamera@CameraFactory@ARToolKitPlus@@QAEPAVCamera@2@PBD@Z) already defined in Main.obj
    myAR.obj : error LNK2005: "public: __thiscall ARToolKitPlus::BCH::BCH(void)" (??0BCH@ARToolKitPlus@@QAE@XZ) already defined in Main.obj
    myAR.obj : error LNK2005: "protected: __thiscall ARToolKitPlus::BCH::BCH(int,int,int)" (??0BCH@ARToolKitPlus@@IAE@HHH@Z) already defined in Main.obj
    myAR.obj : error LNK2005: "protected: void __thiscall ARToolKitPlus::BCH::initialize(int,int,int)" (?initialize@BCH@ARToolKitPlus@@IAEXHHH@Z) already defined in Main.obj
    myAR.obj : error LNK2005: "protected: void __thiscall ARToolKitPlus::BCH::generate_gf(void)" (?generate_gf@BCH@ARToolKitPlus@@IAEXXZ) already defined in Main.obj
    myAR.obj : error LNK2005: "protected: bool __thiscall ARToolKitPlus::BCH::gen_poly(int)" (?gen_poly@BCH@ARToolKitPlus@@IAE_NH@Z) already defined in Main.obj
    myAR.obj : error LNK2005: "protected: void __thiscall ARToolKitPlus::BCH::encode_bch(int *,int const *)" (?encode_bch@BCH@ARToolKitPlus@@IAEXPAHPBH@Z) already defined in Main.obj
    myAR.obj : error LNK2005: "protected: int __thiscall ARToolKitPlus::BCH::decode_bch(int *)" (?decode_bch@BCH@ARToolKitPlus@@IAEHPAH@Z) already defined in Main.obj
    myAR.obj : error LNK2005: "public: void __thiscall ARToolKitPlus::BCH::encode(int * const,unsigned __int64)" (?encode@BCH@ARToolKitPlus@@QAEXQAH_K@Z) already defined in Main.obj
    myAR.obj : error LNK2005: "public: bool __thiscall ARToolKitPlus::BCH::decode(int &,unsigned __int64 &,int const * const)" (?decode@BCH@ARToolKitPlus@@QAE_NAAHAA_KQBH@Z) already defined in Main.obj
    myAR.obj : error LNK2005: "public: void __thiscall ARToolKitPlus::BCH::encode(unsigned __int64 &,unsigned __int64)" (?encode@BCH@ARToolKitPlus@@QAEXAA_K_K@Z) already defined in Main.obj
    myAR.obj : error LNK2005: "public: bool __thiscall ARToolKitPlus::BCH::decode(int &,unsigned __int64 &,unsigned __int64)" (?decode@BCH@ARToolKitPlus@@QAE_NAAHAA_K_K@Z) already defined in Main.obj
    tutta roba che viene da #include <ARToolKitPlus/TrackerMultiMarkerImpl.h> presente in myAR.h.

    Quello che non capisco è: se ho messo #ifndef.... perchè mi vuole iserire due volte i simboli provenienti da una #include????

  7. #7
    Originariamente inviato da fai

    Quello che non capisco è: se ho messo #ifndef.... perchè mi vuole iserire due volte i simboli provenienti da una #include????
    l'ifndef trick (ti consiglio di rimuovere in ogni modo l'underscore prefisso all'etichetta: infatti gli identificatori siffatti sono riservati al compilatore), opera solo a livello di preprocessore, non a livello di compilazione e neppure a livello di linking, serve per proteggerti da eventuali inclusioni ricorsive nella stessa untità di compilazione.

    Quindi giustamente l'unità di compilazione main.c conterrà tutto ciò che viene incluso da myAR.h, ed anche myAR.cpp conterrà tutto ciò che viene incluso da myAR.h.

    A questo punto, onde evitare di continuare tirare ad indovinare, sarebbe bene conoscere esattamente il contenuto di myAR.h, myAR.cpp e main.cpp.

  8. #8
    Utente di HTML.it
    Registrato dal
    Aug 2006
    Messaggi
    13
    Ho ridotto tutto ai minimi termini e, a questo punto credo di poter dare la colpa alla libreria... forse... comunque ecco il codice esattamente com'è ora:

    main.cpp
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h> 
    #include <gl/glut.h>
    
    #include "myAR.h"
    
    int main(int argc char*argv[]){
       return(0);
    }
    myAR.h
    codice:
    #ifndef MYAR_H
    #define MYAR_H
    
    #include <ARToolKitPlus/TrackerMultiMarkerImpl.h>
    
    #endif
    myAR.cpp
    codice:
    #include "myAR.h"
    idee?

  9. #9
    Concordo, è molto probabilmente un errore della libreria, che magari, o è vecchia, oppure va compilata con particolari opzioni di compilazione, o qualche particolare compilatore. Prova a vedere ciò che dice la documentazione della stessa.

  10. #10
    Utente di HTML.it
    Registrato dal
    Aug 2006
    Messaggi
    13
    Grazie per il tuo aiuto!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.