mikrocontroller.net

Forum: PC-Programmierung Was will der Compiler mir sagen "C++"


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Martin M. (ats3788)


Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute solange ich alles im Main File hatte kein Problem
dann lagerte ich die Funktionen in einen Header und
cpp File aus und bekomme folgendes
der compiler schreibt eine exe Datei mit dem Namen des Headers und c++
MyStrings.exe obwohl das Project Test1 heiß und er auch Test1.exe 
geschrieben hat.

Bitte nicht schimpfen ich komme aus der Pascal Welt und programmiere in 
C weil ich gerne Arduinos programmiere ESP32 besser gesagt


> Executing task: C:\MinGW\bin\g++.exe -g d:\projects\test1\Test1.cpp -o 
d:\projects\test1\Test1.exe <

c:/mingw/bin/../lib/gcc/mingw32/8.2.0/../../../../mingw32/bin/ld.exe: 
C:\Users\ats37\AppData\Local\Temp\cc0PWW65.o: in function 
`Z8DoJobIniPcS_':
d:/projects/test1/Test1.cpp:69: undefined reference to `StrPos(char*, 
char*)'
c:/mingw/bin/../lib/gcc/mingw32/8.2.0/../../../../mingw32/bin/ld.exe: 
d:/projects/test1/Test1.cpp:71: undefined reference to `StrDel(char*, 
int, int)'
c:/mingw/bin/../lib/gcc/mingw32/8.2.0/../../../../mingw32/bin/ld.exe: 
d:/projects/test1/Test1.cpp:74: undefined reference to `StrPos(char*, 
char*)'
c:/mingw/bin/../lib/gcc/mingw32/8.2.0/../../../../mingw32/bin/ld.exe: 
d:/projects/test1/Test1.cpp:76: undefined reference to `StrCopy(char*, 
int, int)'
collect2.exe: error: ld returned 1 exit status
The terminal process terminated with exit code: 1

Terminal will be reused by tasks, press any key to close it.

von 50c (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
...das du string.h einbinden sollst

von DPA (Gast)


Bewertung
1 lesenswert
nicht lesenswert
Das undefined undefined reference passiert nach dem Kompilieren, beim 
Linken. Es bedeutet, dass das symbol nirgens gefunden wurde, in keinem 
der Objekte, und in keiner Library (wobei bei letzterem auch die 
Reihenfolge eine rolle spielen kann).

Im Beispiel hast du keine Libraries (ausser implizit die libc) oder 
sonstigen Objekte, du hast nur die Test1.cpp Quelldatei, die du in einem 
Schritt zu kompilieren und linken versuchst. Offenbar enthält diese aber 
keine Definition für u.a. die Funktion "StrCopy(char*, int, int)", 
deshalb gibt es das Symbol nicht, und kann beim linken auch nicht 
gefunden werden.

Übrigens, für z.B. strpos, da gibts schon was vergleichbares in der libc
 / standard library. http://www.cplusplus.com/reference/cstring/strstr/

von icke (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ich vermute, dass die Str..() Funktionen, die ausgelagerten sind?

Du sagst dem GCC, dass er die Datei Test1.cpp kompilieren soll und ein 
Programm Test1.exe erstellen soll (das dann aber der Linker macht).

Die Errors kommen auch von dem Linker. Der Kompiler kennt die Definition 
der Funktionen aus der Header Datei. Beim "Zusammenbauen" der Exe fehlt 
aber die Deklaration (in der neuen cpp).

Du musst also noch die andere cpp kompilieren und dann beide 
ObjektDateien zusammen linken.

Suche mal nach Makefile.

von Johannes S. (jojos)


Bewertung
0 lesenswert
nicht lesenswert
Ein fehlender prototype ist in C++ aber Fehler, das meckert schon der 
Compiler an. Dann wurden die Funktion vorher deklariert, aber beim 
Linken fehlt das obj mit dem Code.

von DPA (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Beim gcc, sowie beim clang, ist die Option um ein ".o" file zu erhalten 
übrigens "-c".
gcc a.c -c -o a.o
gcc b.c -c -o b.o
gcc a.o b.o -o prog.exe

Den Zwischenschritt kann man zwar auch den GCC implizit machen lassen, 
das hier tut das selbe:
gcc a.c b.c -o prog.exe

Man muss immer alle relevanten Dateien angeben, die werden nicht 
automatisch gesucht.

von Martin M. (ats3788)


Bewertung
-6 lesenswert
nicht lesenswert
Ganz lieben dank, aber dafür bin ich zu blöde.
In Delphi gibt es so einen Mumpitz nicht.

von Oliver S. (oliverso)


Bewertung
0 lesenswert
nicht lesenswert
Sicher gibts das da ganz ähnlich.

Oliver

von Carl D. (jcw2)


Bewertung
0 lesenswert
nicht lesenswert
Martin M. schrieb:
> Ganz lieben dank, aber dafür bin ich zu blöde.
> In Delphi gibt es so einen Mumpitz nicht.

modules!

von cppbert (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Oliver S. schrieb:
> Sicher gibts das da ganz ähnlich.

die C Kompiler/Linker Meldungen, Konventionen usw. sind in Delphi schon 
ganz anders - die Sprache hat Module, kennt Library und Application im 
Sprachstandard - d.h. viele Build-Probleme existieren in Delphi so gut 
wie gar nicht, und die Orgien an Fehlermeldungen sind auch eher eine 
C/C++ Sache

von Carl D. (jcw2)


Bewertung
1 lesenswert
nicht lesenswert
cppbert schrieb:
> Oliver S. schrieb:
>> Sicher gibts das da ganz ähnlich.
>
> die C Kompiler/Linker Meldungen, Konventionen usw. sind in Delphi schon
> ganz anders - die Sprache hat Module, kennt Library und Application im
> Sprachstandard - d.h. viele Build-Probleme existieren in Delphi so gut
> wie gar nicht, und die Orgien an Fehlermeldungen sind auch eher eine
> C/C++ Sache

Weswegen C++20 diese Technik übernehmen will, ohne die Nachteile der 
"Vorlage" zu erben.

von M.K. B. (mkbit)


Bewertung
0 lesenswert
nicht lesenswert
Wenn es nichts geheimes ist, dann lade doch Mal die Header- und 
Sourcedatei hoch.
Vielleicht ist es auch ein Fehler, den du nicht siehst.

von cppbert (Gast)


Bewertung
1 lesenswert
nicht lesenswert
Carl D. schrieb:
> cppbert schrieb:
>> Oliver S. schrieb:
>>> Sicher gibts das da ganz ähnlich.
>>
>> die C Kompiler/Linker Meldungen, Konventionen usw. sind in Delphi schon
>> ganz anders - die Sprache hat Module, kennt Library und Application im
>> Sprachstandard - d.h. viele Build-Probleme existieren in Delphi so gut
>> wie gar nicht, und die Orgien an Fehlermeldungen sind auch eher eine
>> C/C++ Sache
>
> Weswegen C++20 diese Technik übernehmen will, ohne die Nachteile der
> "Vorlage" zu erben.

Es ist nur schade das die C++-Komitte so lange gebraucht hat diese Manko 
wenigstens mal als solches zu akzeptieren - jetzt wird schon bestimmt 
seit 4 Jahren an einer Lösung gedoktert und es gibt viele kleine 
Schwächen

-Initiale Builds langsamer weil die Module erst vollständig erzeugt 
werden müssen -> Zwangsserialisierung des Builds (mit Header+Cpp ist das 
einfach egal und dann schreit eben der Linker später)

-Kein Konzept damit ein Build-System leicht erkennen kann ob ein 
Modul-Inteface Änderung ein Neubau des hinterliegenden Codes benötigt - 
bisher wurde da einfach aufs Dateidatum geschaut, das reicht jetzt nicht 
mehr und die Build-Systeme müssen weiterhin allerlei Tricks machen und 
das sauber zu lösen

es gibt einige Leute im Komitee die mit dem aktuellen Stand nicht 
zufrieden sind...

von cppbert (Gast)


Bewertung
0 lesenswert
nicht lesenswert
und solche Problem hat Delphi z.B. nicht weil der Kompiler und Linker 
keine getrennten Einheiten sind - und C-Linkage ist was besonderes, das 
gesondert behandelt wird, einfach viel weniger Einschränkungen um das 
Performant zu bekommen, bei Java und .Net genau so

von Martin M. (ats3788)


Bewertung
0 lesenswert
nicht lesenswert
Trotzdem viele vielen Dank
Für meine Arduino Projekte reicht meine C++ Kenntnisse,
ich kann einfache Objekte schreiben und PlatformIO die komfortable IDE
nimmt das linken der Objekte etwas gelassener.
Hatte in den 80 die Möglichkeit Pascal oder C zu lernen ich hatte mich 
für Pascal entschieden und wenn ich beide Sprachen vergleiche ist Pascal
die bessere Sprache man hätte einiges ändern können modernisieren was 
ich an Post Pascal Sprachen mag sind die {} für begin und end. Oh ich 
bin abgeschweift sorry

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.