C++ Programmieren, Problem mit main

Gast #2617694
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
Gast #2617896
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
Gast #2617916
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.
Gast #2617949
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.
Gast #2618031
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.
#2618094
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren