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 folgendesint 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.