undefined reference to main...
-
Hallo!
Zurzeit lernen wir C-Programmierung unter Benutzung von Linux.
Habe hier vier Dateien: main.c Test.c Print.cdie main sieht in etwa so aus:
int main() { //Formatierte Ein- und Ausgabe: scanf, printf PrintResult("Format IO Test", TestFormatIO()); //Stringoperationen PrintResult("String Test", TestString()); //Dateioperationen PrintResult("File Test", TestFileOp("text.txt")); ... return 0; }
wenn ich gcc main.c eingebe kriege ich folgendes:
bsy3@bsy3:~/Workspace/Übung2$ gcc main.c
/tmp/ccK9Food.o: In functionmain': main.c:.text+0xa): undefined reference to
TestFormatIO'
main.c:.text+0x1a): undefined reference toPrintResult' main.c:.text+0x1f): undefined reference to
TestString'
main.c:.text+0x2f): undefined reference toPrintResult' main.c:.text+0x3b): undefined reference to
TestFileOp'
main.c:.text+0x4b): undefined reference toPrintResult' main.c:.text+0x50): undefined reference to
TestDynMem'
main.c:.text+0x60): undefined reference toPrintResult' main.c:.text+0x65): undefined reference to
TestStruct'
main.c:.text+0x75): undefined reference toPrintResult' main.c:.text+0x7a): undefined reference to
TestArray'
main.c:.text+0x8a): undefined reference toPrintResult' main.c:.text+0x8f): undefined reference to
TestFuncPtr'
main.c:.text+0x9f): undefined reference to `PrintResult'
collect2: error: ld returned 1 exit status
[1]+ Done gedit main.c Print.c Test.cwenn ich die anderen dateien zum kompilieren gebe kriege ich dasselbe
die aufgabenstellung lautet:
fehlerhaftes code zum ausführen bringen (logikfehler und syntaxfehler)
-
ACnut schrieb:
Hallo!
Habe hier vier Dateien: main.c Test.c Print.cDas waren nur zwei.
ACnut schrieb:
die main sieht in etwa so aus:
int main() { //Formatierte Ein- und Ausgabe: scanf, printf PrintResult("Format IO Test", TestFormatIO()); //Stringoperationen PrintResult("String Test", TestString()); //Dateioperationen PrintResult("File Test", TestFileOp("text.txt")); ... return 0; }
Nix inkludiert?
[quote="ACnut"]
wenn ich gcc main.c eingebe kriege ich folgendes:bsy3@bsy3:~/Workspace/Übung2$ gcc main.c
/tmp/ccK9Food.o: In functionmain': main.c:.text+0xa): undefined reference to
TestFormatIO'
main.c:.text+0x1a): undefined reference to `PrintResult'
...gcc main.c anderedatei.c nochanderedatei.c
-
gcc main.c
weist den Compiler an, die Datei main.c zu compilieren und zu linken. Beim Linken versucht er, die Funktionen zu finden, findet sie aber nicht.Es gibt 2 Möglichkeiten. Entweder jede Sourcedatei einzeln erst nur compilieren, indem die Opition -c übergeben wird, und dann alle entstandenen Objektdateien zusammen linken oder gleich alle Sourcedateien mit einem Aufruf compilieren und linke. Also:
gcc -c main.c gcc -c Test.c gcc -c Print.c gcc main.o Test.o Print.o
Oder mit einem Aufruf:
gcc main.c Test.c Print.c
Beides erzeugt eine auführbare Datei
a.out
. Den Namen kannst Du mit der Option -o ändern, also etwa:gcc -o myprog main.o Test.o Print.o
Dann entsteht eine ausführbare Datei
myprog
-
[quote="volkard"]
ACnut schrieb:
Hallo!
Habe hier vier Dateien: main.c Test.c Print.cDas waren nur zwei.
ACnut schrieb:
die main sieht in etwa so aus:
int main() { //Formatierte Ein- und Ausgabe: scanf, printf PrintResult("Format IO Test", TestFormatIO()); //Stringoperationen PrintResult("String Test", TestString()); //Dateioperationen PrintResult("File Test", TestFileOp("text.txt")); ... return 0; }
Nix inkludiert?
natürlich wurden die header inkludiert
tntnet schrieb:
gcc main.c
weist den Compiler an, die Datei main.c zu compilieren und zu linken. Beim Linken versucht er, die Funktionen zu finden, findet sie aber nicht.Es gibt 2 Möglichkeiten. Entweder jede Sourcedatei einzeln erst nur compilieren, indem die Opition -c übergeben wird, und dann alle entstandenen Objektdateien zusammen linken oder gleich alle Sourcedateien mit einem Aufruf compilieren und linke. Also:
gcc -c main.c gcc -c Test.c gcc -c Print.c gcc main.o Test.o Print.o
Oder mit einem Aufruf:
gcc main.c Test.c Print.c
Beides erzeugt eine auführbare Datei
a.out
. Den Namen kannst Du mit der Option -o ändern, also etwa:gcc -o myprog main.o Test.o Print.o
Dann entsteht eine ausführbare Datei
myprog
so habe jetzt eine ctest datei und wie öffne ich das im terminal? durch einen doppelklick im ordner hat er eine txt. erstellt (as er ja auch tun sollte), allerdings kommt da keine konsole für die werteeingabe.
eigentlich müsste er noch nicht kompilieren (ich denke nicht, dass ich alle fehler gefunden habe (denn anscheinend sind nur mehr style-fehler dabei (steht zumindest da wenn ich als flag -pedantic benutze)
bsy3@bsy3:~/Workspace/Übung2$ gcc main.c Print.c Test.c -Wall -pedantic
In file included from main.c:9:0:
Print.h:8:1: warning: C++ style comments are not allowed in ISO C90 [enabled by default]
Print.h:8:1: warning: (this will be reported only once per input file) [enabled by default]
main.c: In function ‘main’:
main.c:13:4: warning: C++ style comments are not allowed in ISO C90 [enabled by default]
main.c:13:4: warning: (this will be reported only once per input file) [enabled by default]
In file included from Test.c:9:0:
Print.h:8:1: warning: C++ style comments are not allowed in ISO C90 [enabled by default]
Print.h:8:1: warning: (this will be reported only once per input file) [enabled by default]
Test.c: In function ‘TestFuncPtr’:
Test.c:238:4: warning: implicit declaration of function ‘PrintStrArr’ [-Wimplicit-function-declaration]krieg nur das in der konsole
kann das jemand auf seinem linux-rechner mal kompilieren?
http://www.imagenetz.de/fb7135f5d/-bung2.rar.htmlhabe was von mingw gelesen, kann man dann den gcc mit emacs oder irgendeinem code-editor verbinden und wenn ja, wie mach ich das?
mfg
hawxgamer
-
In C90 gibt es nur /* */ Kommentare,
die C++ Style // Kommentare gibt es ab C99 mit -std=c99 bringst du gcc in den C99 modusTest.c:238:4: warning: implicit declaration of function ‘PrintStrArr
Du hast PrintStrArr nicht deklariert
-
das mit dem PrintStrArr war Absicht von mir, weil ich bei dem Codestück die Parameterliste nicht so ganz verstehe (werde gleich ein Topic für dieses Problem öffnen).
Diese warning mit dem Kommentar:
Heißt das, dass der Comiler automatisch zu den anderen C-Standards nachschaut und falls vorhanden, dann einfach weiterkompiliert und nur eine warning ausgibt?
und kann man das erzeugte Programm auch unter Windows zum laufen bringen?mfg
hawxgamer