Forum: Compiler & IDEs C++ Programmieren, Problem mit main


von Steffen (Gast)


Lesenswert?

Hi,
und zwar möchte ich mit dem AVRSTudio C++ programmieren. Wie ich jetzt 
beim Durchstöbern herausgefunden habe, erreiche ich dies, indem ich die 
Dateien in .cpp umbenenne.
Jetzt habe ich allerdings das Problem, wenn ich die main.c in main.cpp 
umbenenne, dass er sie nicht mehr findet und folgende Fehlermeldung 
""gcrt1.S:52: undefined reference to `main'"" erscheint. Benenne ich sie 
um, findet er sie zwar wieder, aber kann natürlich mit dem C++ Code nix 
anfangen.

Habt Ihr da vlt. eine Idee.

lg Steff

von emsen (Gast)


Lesenswert?


von Steffen (Gast)


Lesenswert?

Danke, das hab ich schon gesehen. Allerdings gabs damals noch einiges, 
dass nicht funktioniert.
Zur Zeit habe ich diese Version drauf 
http://www.atmel.com/Microsite/atmel_studio6/compiler_editor.aspx und 
hatte gehofft, dass sich da ein bisschen was getan hat.

lg

von Oliver (Gast)


Lesenswert?

???

Ob du deine Datei main.cpp oder mueller.cpp nennst, sit völlig egal. 
Wichtig ist nur, daß es da drin eine Funtion main() gibt. Und wenn der 
Compiler die compiliert, dann funktioniert das auch mit C++.

Das C++ auf dem AVR nur eingeschränkt nutzbar ist, hat nichts mit dem 
Studio zu tun. Das liegt nur daran, daß es dafür keine vollständige 
C++-Standardlib gibt.

Oliver

von Steffen (Gast)


Lesenswert?

Also, wenn ich die main in .cpp umbenenne, bekomme ich die Fehlermeldung 
"Fehler  1  undefined reference to `main' 
/data2/home/toolsbuild/jenkins-knuth/workspace/avr8-gnu-toolchain/src/av 
r-libc/crt1/gcrt1.S   52  1  "
Nachdem ich einiges gegoogelt hatte, bekam ich heraus, dass dies wohl 
heist, dass er die main nicht mehr findet. Ich habe sie wieder in main.c 
umbenannt. Und er hat wieder compiliert, allerdings jetzt natürlich ohne 
C++ was andere Fehler verursacht.

von Peter II (Gast)


Lesenswert?

wie die deine definition von main?

deklariere sie mal als extern "C"

von emsen (Gast)


Lesenswert?

Steffen schrieb:
> dass er die main nicht mehr findet.

Wie denn auch? Der C-Compiler sucht die Funktion "main()", und die 
erwartet er in einer Datei mit Endung ".c". Hier also "main.c". Wenn da 
allerdings C++-Code drinnen steht, sieht der C-Compiler alt aus...
Der C++-Compiler dagegen sucht diese Funktion in einer Datei "main.cpp".
Und dieser C++-Compiler funktioniert wegen unzureichender .lib eben 
nicht so weit wie der C-Compiler.

von Peter II (Gast)


Lesenswert?

emsen schrieb:
> Wie denn auch? Der C-Compiler sucht die Funktion "main()", und die
> erwartet er in einer Datei mit Endung ".c".

so ein unsinn, ich kann die Datei nennen wie ich will. Zur not auch 
.txt. Der Fehler kommt vom Linker und dieser sieht nur object files und 
keinen quellcode.

Ich kann mir nur vorstellen das die main bei c++ einem name mangling 
unterzogen wird. Damit sind die Parameter in name mit codiert. Wenn aber 
die Runtimelib damit nicht klar kommt, kommt es zu diesem linker fehler. 
Aus dem Grund sollte er sie als extern "C" deklarieren.

von Roland H. (batchman)


Lesenswert?

Welcher AVR-GCC kommt zum Einsatz?
Mit welchen Optionen wird kompiliert und gelinkt?
Was sagt "avr-nm main.o" im Falle von C und im Falle von C++?

Peter II schrieb:
> Ich kann mir nur vorstellen das die main bei c++ einem name mangling
> unterzogen wird. Damit sind die Parameter in name mit codiert. Wenn aber
> die Runtimelib damit nicht klar kommt, kommt es zu diesem linker fehler.
> Aus dem Grund sollte er sie als extern "C" deklarieren.

Ich habe es eben geprüft, beim GCC kommt main nicht in die "Mangel" 
(AVR, ARM, MIPS, MSP430). Lediglich RX macht ein "_main" daraus.

Mir fällt allerdings auch nichts anderes sein, außer dem "name 
mangling". Vermutlich findet dies tatsächlich statt, und der Startup 
findet den Einstieg nicht.

Ich verwende nur C++, und es geht in jedem Fall mit AVR GCC 4.3.5, 
avr-libc 1.6.8, ohne besonderes Zutun, allerdings "direkt" mit make 
unter Linux ohne AVRStudio. Mit "avr-gcc" als Frontend genügt in der Tat 
die Endung .cpp

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.