Probleme beim Kompilieren unter Linux

Hallo Leute!

Ich habe folgendes Problem, wer kann mir da weiterhelfen?

habe ein einfaches Programm geschrieben, das so aussieht:

#include
#include
int main (void) {
double x=2.5,y;
y= pow(x,3.0);
printf("\n2.5 hoch 3 ergibt: %f\n",y);
printf("\n(3 hoch 2.5) ergibt: %f\n",2+pow(3.0,x));
}

dann habe ich unter linux die Konsole aufgerufen und den Befehl:

gcc -o aufgabe3 aufgabe3.c eingegeben.(Suse10.2)

DAS PROBLEM
/tmp/ccipWMPk.o: In function main': aufgabe3\_1.c:frowning:.text+0x2b): undefined reference to pow’
aufgabe3_1.c:frowning:.text+0x56): undefined reference to `pow’
collect2: ld returned 1 exit status

was soll ich machen? bitte helft mir

Danke im Voraus

Hallo

gcc -o aufgabe3 aufgabe3.c eingegeben.(Suse10.2)

gcc -lm -o aufgabe3 aufgabe3.c

CMБ

Hallo

gcc -o aufgabe3 aufgabe3.c eingegeben.(Suse10.2)

gcc -lm -o aufgabe3 aufgabe3.c

CMБ

Wow!

Tatsächlich haut es hin!

Dankeschön!

bloß noch eine Kleinigkeit:

das kompilierte Programm lässt sich nicht starten, z.B. wenn ich

aufgabe3 eintippe, kommt immer command not found als Fehlermeldung, obwohl eine ausführbare datei exisitiert. Wo ist denn das Problemchen?

Hallo

das kompilierte Programm lässt sich nicht starten, z.B. wenn
ich
aufgabe3 eintippe, kommt immer command not found als
Fehlermeldung, obwohl eine ausführbare datei exisitiert. Wo
ist denn das Problemchen?

 ./aufgabe3

Grüße

CMБ

Hallo

das kompilierte Programm lässt sich nicht starten, z.B. wenn
ich
aufgabe3 eintippe, kommt immer command not found als
Fehlermeldung, obwohl eine ausführbare datei exisitiert. Wo
ist denn das Problemchen?

SMB schrieb:

./aufgabe3

Grüße

CMБ

Hallo Semjon Michailowitsch!

Das mit dem Programm haut jetzt hin. Dankeschön.

Ich habe noch ein Anliegen:
ich habe ein Buch über’s C-Programmieren, da sind Beispielprogramme, die ich in dann selbst kompiliere.

Hab wieder das gleiche Problem beim Kompilieren wie vorher, diesmal folgendes Programm:
**********************************************************************
/* Es werden drei Zufallszahlen ausgegeben */

#include

void srand (unsigned int seed); // Prototyp von srand()
int rand(void); // Prototyp von rand()

int main() {

printf("\nEs werden drei Zufallszahlen ausgegeben!");

int zahl_1, zahl_2, zahl_3;

srand(7); // Initialisierung mit beliebiger Zahl

zahl_1=rand();
zahl_2=rand();
zahl_3=rand();

printf("\nDrei Zufallszahlen: %d %d %d\n\n",zahl_1,zahl_2,zahl_3);

return 0;
}
**********************************************************************

ich tippe folgendes ein: gcc -lm -o auf3_2 auf3_2.C

folgende Fehler:
**********************************************************************
/tmp/ccQ863zi.o: In function main': auf3\_2.C:frowning:.text+0x25): undefined reference to srand(unsigned int)’
auf3_2.C:frowning:.text+0x2a): undefined reference to rand()' auf3\_2.C:frowning:.text+0x32): undefined reference to rand()’
auf3_2.C:frowning:.text+0x3a): undefined reference to rand()' /tmp/ccQ863zi.o:frowning:.eh\_frame+0x11): undefined reference to __gxx_personality_v0’
collect2: ld returned 1 exit status
**********************************************************************

wie es aussieht, hat er ein problem mit srand() und rand() und ‚__gxx_personality_v0‘

undefined reference to srand und rand kriege ich mit #include weg, aber undefined reference to ‚__gxx_personality_v0‘ kriege nicht weg.

Oh je, ist das kompliziert, vielleicht sollte ich lieber in windows kompilieren um den Leuten hier keine Kopfprobleme zu bereiten. :open_mouth:)

vielen Dank für Ihre Hilfe im Voraus

gruß

alexander

Hallo Alexander,

ich tippe folgendes ein: gcc -lm -o auf3_2 auf3_2.C

Das ‚-lm‘ benötigst Du nur, wenn Du Funktionen aus der math.h verwendest (wie ‚sin‘ und ‚pow‘).

folgende Fehler:
**********************************************************************
/tmp/ccQ863zi.o: In function main': auf3\_2.C:frowning:.text+0x25): undefined reference to srand(unsigned
int)’
auf3_2.C:frowning:.text+0x2a): undefined reference to rand()' auf3\_2.C:frowning:.text+0x32): undefined reference to rand()’
auf3_2.C:frowning:.text+0x3a): undefined reference to rand()' /tmp/ccQ863zi.o:frowning:.eh\_frame+0x11): undefined reference to __gxx_personality_v0’
collect2: ld returned 1 exit status
**********************************************************************

Wenn Du in C programmierst, dann nehme als Endung ‚.c‘ (kleines C). Mit großem C benennt man C+±Quelldateien. Dann kommt auch der gcc nicht durcheinander und bindet die benötigten Bibliotheken ein.

wie es aussieht, hat er ein problem mit srand() und rand() und
‚__gxx_personality_v0‘

undefined reference to srand und rand kriege ich mit #include
weg, aber undefined reference to
‚__gxx_personality_v0‘ kriege nicht weg.

Das Problem tritt bei mir nicht auf wenn ich entweder .c statt .C nutze (s.o.) oder mit g++ die Datei übersetze.

Generell ist es sinnvoll, daß Du bei Verwendung einer Funktion aus einer Bibliothek die entsprechende header-Datei einbindetst (hier ‚stdlib.h‘, welche erfährst Du mit ‚man 3 rand‘) anstatt die Funktionen selber zu deklarieren.

Oh je, ist das kompliziert, vielleicht sollte ich lieber in
windows kompilieren um den Leuten hier keine Kopfprobleme zu
bereiten. :open_mouth:)

Da wirst Du wahrscheinlich die gleichen Probleme bekommen, wenn Du auch den gcc nutzt.

Viele Grüße
Diether

Grüß Dich Alex,
der Dieter hat Recht. In dem Fall ist es unnötig und falsch
mit der Math Library zu linken. Wenn Du die Dateiendung .c
statt .C verwendest geht alles, da der Compiler sonst das
File als C++ übersetzt. Ich würde aber die Funktionen
auch nicht nochmal deklarieren und stattdessen das richtige
Include File includieren also stdlib.h.
Also wenn Du mit dem g++ das .C, .cc oder .cpp File
compilieren möchtest mußt Du schauen, daß das Namemangling
paßt. In Deinem Fall kann c++ den Namen nicht auflösen weil
die Definition nicht zu libc paßt. Damit es wieder
paßt, müßtest Du extern „C“ davorschreiben.
extern „C“ void srand (unsigned int seed);
extern „C“ int rand(void);
(Dann solltest Du aber den g++ zum kompiliern/linken
verwenden oder Du mußt dem gcc -lstdc++ zum Linken angeben
z.B. gcc auf3_2.C -lstdc++ -o auf3_2. Letzteres ist aber
nicht empfohlen!!! )

Also bitte auf die Dateiendung achten und C++ Dateien
(.C, .cc, und .cpp) immer mit dem g++ übersetzen und in
die Manpage zur verwendeten Funktion schauen. Dann findest
Du das richtige Headerfile was Du includieren mußt.

man 3 rand
wäre es in dem Fall auf meinem Rechner. Allgemeiner wäre
man -a rand

Servus,
Roland

alle Probleme beseitigt!

Dankeschön Euch allen!

alle Probleme damit vom Tisch! Jetzt kann ich mich voll aufs Programmieren konzentrieren!

schönen Gruß

alex

PS:da sieht man, dass gcc noch casesensitiv ist! cool! :open_mouth:)

Hallo,

PS:da sieht man, dass gcc noch casesensitiv ist! cool! :open_mouth:)

Das hat nichts mit gcc zu tun. Linux ist, wie jedes schlaue Betriebssystem case-sensitive. Selbst Dein Gehirn ist es. Du erkennst den Unterschied zwischen „c“ und „C“. Aber Windows schafft das komischerweise nicht.

Gruß,
-Efchen

P.S.: Du solltest Dich ein bisschen mehr mit Linux und Deinem Compiler und wie man C-Programme bindet und sowas auseinandersetzen. Sonst wirst Du immer wieder auf Schwierigkeiten laufen. Ich wage zu behaupten, dass Du aus den anfänglichen Antworten nicht viel gelernt hast, wie man ja bei Deiner zweiten Frage gemerkt hat.
Aber Kopf hoch, aller Anfang ist schwer :smile:

Sie meinen, dass ich nichts gelernt hab’.

hmmm,

wer fragt, ist für 5 Minuten blöd

wer nicht, für immer

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Sie meinen, dass ich nichts gelernt hab’.

Ich hatte in der Tat den Eindruck, als wären die Antworten etwas
zu knapp ausgefallen, um den Sinn dahinter zu verstehen.

wer fragt, ist für 5 Minuten blöd
wer nicht, für immer

Ich sah meine Antwort als Ermutigung, weiter zu fragen.
Zu hinterfragen, warum das so ist und nicht anders.

Schönen Tag noch,
-Efchen