C-Compiler falsch installiert?
C-Compiler falsch installiert?
Hallo,
ich hoffe hier kann mir jemand helfen:
ich versuche unter Kubuntu meine C-Progrämchen zu kompilieren und ausuzuführen, bekomme aber beim Kompilieren eine Meldung mit der ich nichts anfangen kann
/usr/lib/gcc/i486-linux-gnu/4.0.3/../../../../lib/crt1.o: In function `_start':../sysdeps/i386/elf/start.S:115: undefined reference to `main'
collect2: ld gab 1 als Ende-Status zurück
Ich habe auch schon mit der einfachsten variante von Hello World ausprobiert. In dem Fall lässt sich die datei kompilieren aber gibt beim Ausführen nichts aus.
Ein weiteres einfaches Testprogram gibt mir folgende Meldung aus
bash: test2: command not found
So.. habe keine Ahnung ob die Fälle ein gemeinsames Problem haben und weiss nicht wirklich, wo es schief laufen könnte.
Wäre toll wenn jemand mir da weiterhelfen könnte,
Gruß
ich hoffe hier kann mir jemand helfen:
ich versuche unter Kubuntu meine C-Progrämchen zu kompilieren und ausuzuführen, bekomme aber beim Kompilieren eine Meldung mit der ich nichts anfangen kann
/usr/lib/gcc/i486-linux-gnu/4.0.3/../../../../lib/crt1.o: In function `_start':../sysdeps/i386/elf/start.S:115: undefined reference to `main'
collect2: ld gab 1 als Ende-Status zurück
Ich habe auch schon mit der einfachsten variante von Hello World ausprobiert. In dem Fall lässt sich die datei kompilieren aber gibt beim Ausführen nichts aus.
Ein weiteres einfaches Testprogram gibt mir folgende Meldung aus
bash: test2: command not found
So.. habe keine Ahnung ob die Fälle ein gemeinsames Problem haben und weiss nicht wirklich, wo es schief laufen könnte.
Wäre toll wenn jemand mir da weiterhelfen könnte,
Gruß
Wie sieht dein Quelltext aus? Mit welchem Befehl kompilierst Du deinen Quelltext?
Scheinbar hast Du einmal keine main-Methode definiert und dein zweites Testprogramm kann die Bash nicht finden. Evtl ./test2 starten oder die Ausgabedatei heißt anders.
Aber du solltest ein konkretes Beispiel liefern. Sonst kann man nur im Dunkeln stochern bzw. die Besitzer von Glaskugeln können evtl. helfen.
Scheinbar hast Du einmal keine main-Methode definiert und dein zweites Testprogramm kann die Bash nicht finden. Evtl ./test2 starten oder die Ausgabedatei heißt anders.
Aber du solltest ein konkretes Beispiel liefern. Sonst kann man nur im Dunkeln stochern bzw. die Besitzer von Glaskugeln können evtl. helfen.
MfG GoKi
:wq
:wq
danke für die schnelle Antwort!
test2 hat schon funktioniert: ich sollte es wirklich mit ./test2 ausführen. aber warum nicht einfach test2? dasselbe mit Hello World.
bei dem ersten Problem klappt es immer noch nicht mit dem compilieren. Das stimm, da ist keine main drin :
#include <stdio.h>
#include <string.h>
int checkpass(void){
int x;
char a[9];
x = 0;
fprintf(stderr,"a at %p and\nx at %p\n", (void *)a, (void *)&x);
printf("Enter a short word: ");
scanf("%s", a);
if (strcmp(a, "mypass") == 0)
x = 1;
return x;
}
aber ich habe daraus durch gcc -c checkpass checkpass.c eine .o datei erzeugt, und bekomme jetzt beim kompilieren von dem main Program diese Meldung:
/tmp/cc0jXQA2.o: In function `main':checkpasstest.c:(.text+0x1d): undefined reference to `checkpass'
collect2: ld gab 1 als Ende-Status zurück
Das Program sieht so aus:
#include <stdio.h>
int checkpass(void);
int main(void) {
int x;
x = checkpass();
fprintf(stderr, "x = %d\n", x);
if (x)
fprintf(stderr, "Password is correct!\n");
else
fprintf(stderr, "Password is not correct!\n");
return 0;
}
Ich vermute mir fehlt ein Makefile, der sie zusammenlinkt.
Probiere mal aus..
test2 hat schon funktioniert: ich sollte es wirklich mit ./test2 ausführen. aber warum nicht einfach test2? dasselbe mit Hello World.
bei dem ersten Problem klappt es immer noch nicht mit dem compilieren. Das stimm, da ist keine main drin :
#include <stdio.h>
#include <string.h>
int checkpass(void){
int x;
char a[9];
x = 0;
fprintf(stderr,"a at %p and\nx at %p\n", (void *)a, (void *)&x);
printf("Enter a short word: ");
scanf("%s", a);
if (strcmp(a, "mypass") == 0)
x = 1;
return x;
}
aber ich habe daraus durch gcc -c checkpass checkpass.c eine .o datei erzeugt, und bekomme jetzt beim kompilieren von dem main Program diese Meldung:
/tmp/cc0jXQA2.o: In function `main':checkpasstest.c:(.text+0x1d): undefined reference to `checkpass'
collect2: ld gab 1 als Ende-Status zurück
Das Program sieht so aus:
#include <stdio.h>
int checkpass(void);
int main(void) {
int x;
x = checkpass();
fprintf(stderr, "x = %d\n", x);
if (x)
fprintf(stderr, "Password is correct!\n");
else
fprintf(stderr, "Password is not correct!\n");
return 0;
}
Ich vermute mir fehlt ein Makefile, der sie zusammenlinkt.
Probiere mal aus..
-
- Beiträge: 3472
- Registriert: 30.11.2005 10:32:22
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: Wald
Du brauchst nicht zwangsläufig ein Makefile um ein Programm aus mehreren Dateien zu kompilieren(obwohl es sicher bei grösseren Projekten besser ist), so geht's auch:
Code: Alles auswählen
gcc -o checkpasstest checkpass.c checkpasstest.c
Ein einfaches Makefile könnte dann z.B. so aussehen
und ./test2 musst du angeben, weil sich das aktuelle Verzeichnis (in dem test2 liegt) nicht in $PATH befindet.
Code: Alles auswählen
CC = gcc
all: checkpasstest
clean:
rm *.o
checkpasstest: checkpass.o checkpasstest.o
${CC} -o $@ $^
%.o: %.c
${CC} -c $< -o $@
MfG GoKi
:wq
:wq
Weil das aktuelle Verzeichnis für gewöhnlich unter Unixartigen System nicht in der PATH Variable ein getragen ist damit einem nicht so leicht böse Dateien untergeschoben werden können.dina hat geschrieben:test2 hat schon funktioniert: ich sollte es wirklich mit ./test2 ausführen. aber warum nicht einfach test2? dasselbe mit Hello World.
Wenn du es aber trotzdem so willst füge in deiner ~/.bash_profile das hinzu:
Code: Alles auswählen
PATH=.:$PATH
i support free software: http://www.fsfe.org/en/fellows/esteel
a great free and opensource FPS game: http://nexuiz.com
a great free and opensource FPS game: http://nexuiz.com
Z.B. könntest du sonst ein Shellskript names "ls" in dein Homeverzeichnis mit dem Inhalt "rm -rf ~" packen, und wenn dein "Freund" eingeloggt ist, ihn mal kurz zu bitten nachzuschauen, "wie nochmal diese eine Datei in deinem Verzeichnis hieß". Wenn er dann "cd /dein_homeverzeichnis; ls" macht, sind seine Daten weg!esteel hat geschrieben:Weil das aktuelle Verzeichnis für gewöhnlich unter Unixartigen System nicht in der PATH Variable ein getragen ist damit einem nicht so leicht böse Dateien untergeschoben werden können.
Stimmt, in dem Fall ist es ETWAS sicherer zu benutzen da in dem Fall das richtige ls gefunden wird da der aktuelle Pfad erst als letztes durchsucht wird. Aber im Prinzip besteht die Gefahr auch dann noch deswegen sollte man sich einfach das ./DATEI angewöhnen und zwei Zeichen mehr tippen als sich einer Gefahr aus zu setzen.
Und sorry aber ich habe dazu noch eine kleine Offtopic Frage. Gibt es einen einfachen Weg rauszufinden ob ein bestimmer Pfad schon in der PATH Variable ist? Ich füge z.b. in der ~/.bash_profile das Verzeichnis ~/bin hinzu und das passiert immer wieder wenn ich eine subshell starte. (Z.b. wenn ich screen starte und aus dem screen heraus einen emacs mit einer eigenen Shell starte habe ich ~/bin schon dreimal in PATH..) Klar könnte ich $SHLVL testen und nur bei 1 den Pfad hinzufügen aber das ist finde ich unschön..
Code: Alles auswählen
PATH=$PATH:.
Und sorry aber ich habe dazu noch eine kleine Offtopic Frage. Gibt es einen einfachen Weg rauszufinden ob ein bestimmer Pfad schon in der PATH Variable ist? Ich füge z.b. in der ~/.bash_profile das Verzeichnis ~/bin hinzu und das passiert immer wieder wenn ich eine subshell starte. (Z.b. wenn ich screen starte und aus dem screen heraus einen emacs mit einer eigenen Shell starte habe ich ~/bin schon dreimal in PATH..) Klar könnte ich $SHLVL testen und nur bei 1 den Pfad hinzufügen aber das ist finde ich unschön..
i support free software: http://www.fsfe.org/en/fellows/esteel
a great free and opensource FPS game: http://nexuiz.com
a great free and opensource FPS game: http://nexuiz.com
Hallo!
denke dass dir sowas auch nicht viel besser gefallen wird, als wie der umweg über $SHLVL, aber trotzdem
mfg
denke dass dir sowas auch nicht viel besser gefallen wird, als wie der umweg über $SHLVL, aber trotzdem
Code: Alles auswählen
#!/bin/sh
if [ ! "$(echo $PATH | grep `pwd`:)" == "" ];
then
export PATH="${PATH}:~/bin"
fi