ggc probleme - "undefined reference to"



  • hallo,

    ich verwende gcc 2.95.4 und habe folgenden beispiel-code:

    start.cpp:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #include "params.h"
    
    int main(void) {
    	CParams tmp1;
    
    }
    

    params.h

    #pragma once
    
    class CParams
    {
    public:
    	CParams(void);
    	~CParams(void);
    
    };
    

    params.cpp

    #include "StdAfx.h"
    #include ".\params.h"
    
    CParams::CParams(void)
    {
    }
    
    CParams::~CParams(void)
    {
    }
    

    Mit VC7 geht das kompilieren problemlos. Unter linux kommt die folgende fehlermeldung:

    /tmp/cchTmLU7.o: In function `main':
    /tmp/cchTmLU7.o(.text+0xe): undefined reference to `CParams::CParams(void)'
    /tmp/cchTmLU7.o(.text+0x2a): undefined reference to `CParams::~CParams(void)'
    /tmp/cchTmLU7.o(.text+0x4a): undefined reference to `CParams::~CParams(void)'
    collect2: ld returned 1 exit status
    

    Woran liegt das und wie kann ich es beheben? Ich kann auf dem System leider keinen neueren Compiler (z.b. gcc 3.2) installieren.

    Noch eine frage: wenn ich code unter cygwin compiliere, kann ich dann diese binaries auf einer linux maschine ausführen (falls beides i386er architekturen sind)?

    danke,



  • benutze mal g++ stat gcc zum compilen. linken sollte auch mit dem gcc funktionieren.

    sollte nicht auch

    #include ".[b][/b]params.h"
    

    probleme bereiten ?

    unter linux ist "/" der seperator

    ob dein binary unter linux läuft hängt davon ab, ob die verwendeten libs
    die gleichen sind, bzw. ob die lib-versionen kompatibel sind.
    cygwin linkt da sicher noch jede menge WIN spezifisches zeug mit rein,
    also wird das nicht gehen.



  • und dieses:
    #include "StdAfx.h"
    findet er garantiert nicht 🙂



  • ich verwende sowieso g++. war ein fehler von mir.

    außerdem habe ich eure beiden vorschläge eingebaut, und die fehlermeldung bleibt leider die gleiche.



  • in g++ version 3.3.5 lautet der fehler übrigens:

    /tmp/ccpLWpO7.o(.text+0x17): In function `main':
    : undefined reference to `CParams::CParams[in-charge]()'
    /tmp/ccpLWpO7.o(.text+0x22): In function `main':
    : undefined reference to `CParams::~CParams [in-charge]()'
    collect2: ld returned 1 exit status
    


  • einmal schreibt man kein (void) in c++
    zum zweiten: wie ist dein aufruf, nimmst du vielleicht die .cpp mit den implenentierungen nicht mit?



  • elise schrieb:

    einmal schreibt man kein (void) in c++
    zum zweiten: wie ist dein aufruf, nimmst du vielleicht die .cpp mit den implenentierungen nicht mit?

    danke. 2teres war das problem. dass kommt davon wenn man immer mit einer IDE arbeitet...



  • elise schrieb:

    einmal schreibt man kein (void) in c++

    Seit wann denn das?
    Gilt doch nur für die Main?



  • roan312 schrieb:

    Seit wann denn das?
    Gilt doch nur für die Main?

    Nein, auch "int main(void)" ist in C++ gültig.
    Was elise meinte, ist folgendes

    int foo(void); // void ist redundant, man kann auch einfach
    int foo(); // schreiben.
    

    Früher in C war das nicht äquivalent, in C++ glücklicherweise schon.

    Aber das ist ohnehin nur einer der Punkte, die ich bemängeln würde, die C-Klassenpräfixe (CIchBinEineKlasse, CIchAuch), exzessives Einbinden von C-Headern sowie die Verwendung von VC++-only-Makros fallen mir ungefähr zeitgleich auf. 😉

    // Hier ist das .\ oder ./ überflüssig, warum schreibst Du nicht einfach "params.h"?
    #include ".\params.h"
    


  • Versuchs mal mit

    g++ start.cpp params.cpp -o start.exe
    

    Denke das Problem ist das du params.o nicht dazulinkst.
    Kurt



  • Kurt: Die Lösung ist schon gefunden. (Siehe 19:33-Post.)



  • nman schrieb:

    Kurt: Die Lösung ist schon gefunden. (Siehe 19:33-Post.)

    Sorry hab ich überlesen. ( hab aber nicht abgeschrieben ). 😉
    Kurt



  • nman schrieb:

    Aber das ist ohnehin nur einer der Punkte, die ich bemängeln würde, die C-Klassenpräfixe (CIchBinEineKlasse, CIchAuch), exzessives Einbinden von C-Headern sowie die Verwendung von VC++-only-Makros fallen mir ungefähr zeitgleich auf. 😉

    Die VC Präprozessoranweisung (#pragma) würd ich auch weglassen.


Anmelden zum Antworten