C-Compiler falsch installiert?

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
dina
Beiträge: 4
Registriert: 22.10.2006 00:02:34

C-Compiler falsch installiert?

Beitrag von dina » 22.10.2006 00:08:42

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ß

Benutzeravatar
GoKi
Beiträge: 2068
Registriert: 04.07.2003 23:08:56
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von GoKi » 22.10.2006 00:16:43

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.
MfG GoKi
:wq

dina
Beiträge: 4
Registriert: 22.10.2006 00:02:34

Beitrag von dina » 22.10.2006 00:45:15

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..

Spasswolf
Beiträge: 3472
Registriert: 30.11.2005 10:32:22
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Wald

Beitrag von Spasswolf » 22.10.2006 01:10:27

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

Benutzeravatar
GoKi
Beiträge: 2068
Registriert: 04.07.2003 23:08:56
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von GoKi » 22.10.2006 01:18:45

Ein einfaches Makefile könnte dann z.B. so aussehen

Code: Alles auswählen

CC = gcc

all: checkpasstest

clean:
  rm *.o

checkpasstest: checkpass.o checkpasstest.o
  ${CC} -o $@ $^

%.o: %.c
  ${CC} -c $< -o $@
und ./test2 musst du angeben, weil sich das aktuelle Verzeichnis (in dem test2 liegt) nicht in $PATH befindet.
MfG GoKi
:wq

dina
Beiträge: 4
Registriert: 22.10.2006 00:02:34

Beitrag von dina » 22.10.2006 01:21:08

So ist es wenn man in der Vorlesung nicht aufgepasst hat :oops: aber das merke ich mir wenigstens für länger!
Danke noch mal für die HIlfe!

Gruß

dina

Benutzeravatar
esteel
Beiträge: 242
Registriert: 23.07.2002 11:06:25
Kontaktdaten:

Beitrag von esteel » 23.10.2006 14:13:19

dina hat geschrieben:test2 hat schon funktioniert: ich sollte es wirklich mit ./test2 ausführen. aber warum nicht einfach test2? dasselbe mit Hello World.
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.
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

dina
Beiträge: 4
Registriert: 22.10.2006 00:02:34

Beitrag von dina » 23.10.2006 19:05:12

danke, funktioniert jetzt wie ich es wollte :)

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 23.10.2006 22:53:26

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.
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!

Benutzeravatar
esteel
Beiträge: 242
Registriert: 23.07.2002 11:06:25
Kontaktdaten:

Beitrag von esteel » 24.10.2006 10:23:14

Stimmt, in dem Fall ist es ETWAS sicherer

Code: Alles auswählen

PATH=$PATH:.
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..
i support free software: http://www.fsfe.org/en/fellows/esteel
a great free and opensource FPS game: http://nexuiz.com

Benutzeravatar
Mike1985
Beiträge: 148
Registriert: 01.05.2005 14:38:11
Wohnort: Lienz / Austria
Kontaktdaten:

Beitrag von Mike1985 » 24.10.2006 12:30:36

Hallo!

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
mfg

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 24.10.2006 21:20:29

esteel hat geschrieben:Ich füge z.b. in der ~/.bash_profile das Verzeichnis ~/bin hinzu und das passiert immer wieder wenn ich eine subshell starte.
Kann es sein, dass du die bash_profile von deiner bashrc aus inkludierst?

Antworten