C Fehler beim Kompilieren?
Ich habe beim Kompilieren meines Programms den Fehler
collect2: error: ld returned 1 exit status
bekommen, was bedeutet er und meine eigentliche Frage: wie behebe ich diesen
das wäre die komplette Ausgabe des Compilers:
/tmp/cclgkP2u.o: In Funktion »main«:
Programm.c:(.text+0x11a): Warnung: undefinierter Verweis auf »sqrt«
collect2: error: ld returned 1 exit status
Danke im Voraus
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(){
//Datei öffnen etc.
FILE *fp;
fp = fopen("Mathe_11.5.txt", "w");
//Definieren der erforderlichen Variablen
int a, b, pn, bQuadrat, bMal2, Platzhalter;
char Variablenname;
double WurzelPlatzhalter;
//Anfang des Programms
printf("Datei geöffnet\n");
do{
//Einlesen der erforderlichen Daten
//Einlesen: pn
printf("postiv oder negativ?:");
scanf("%d", &pn);
//Einlesen: B Quadrat
printf("B Quadrat:");
scanf("%d", &bQuadrat);
//Einlesen: B Mal 2
printf("B mal 2:");
scanf("%d", &bMal2);
//Einlesen: X
printf("Variablenname:");
scanf("%c", &Variablenname);
printf("Alle Zahlen eingelesen\n");
//weitere Berechnungen
Platzhalter = (bMal2 / 2);
if(bQuadrat < 0){
Platzhalter = Platzhalter - bQuadrat;
// if(Platzhalter < 0)
// Platzhalter = Platzhalter * -1;
}
else
Platzhalter = Platzhalter - bQuadrat;
WurzelPlatzhalter = sqrt(Variablenname);
printf("Schreibvorgang beginnt");
fprintf(fp,"%c² + %d%c + %d = 0\n", Variablenname, bMal2, Variablenname, bQuadrat);
fprintf(fp,"%c² + %d%c + %d + %d - %d = 0\n", Variablenname, bMal2, Variablenname, bQuadrat, Platzhalter, Platzhalter);
fprintf(fp,"(%c + %d)² - %d\n", Variablenname, bMal2 / 2, Platzhalter);
fprintf(fp,"(%c + %d)² = %d\n", Variablenname, bMal2 / 2,Platzhalter);
fprintf(fp,"%c + %d = %f oder %d + %d = %f\n", Variablenname, bMal2 / 2 , WurzelPlatzhalter, Variablenname, bMal2 / 2, WurzelPlatzhalter * -1);
fprintf(fp,"%c = %f %c = %f",Variablenname, (bMal2 /2) + WurzelPlatzhalter, Variablenname, (bMal2 /2) + WurzelPlatzhalter * -1);
}while(a == 0);
fclose(fp);
return 0;
}
Danke für eure Hilfe.
Der Link von DonkeyShot hat mir die Lösung gebracht, wie auch die Antwort von ralphdieter kurze Zeit später
Die Frage ist also gelöst
4 Antworten
Die Funktion sqrt ist in libm definiert. Compiliere also mit der Option -lm.
Eigentlich sollte das automatisch passieren, wenn Du math.h inkludiert hast.
Ja, aber da die Header mit dem Compiler geliefert werden, versteht er das entsprechende "#pragma link libm" (oder so) auch. Normalerweise funktioniert das alles prima. Ich vermute, dass hier eine Code-Optimierung quer schießt...
Ja, zumindest für die 'Internen' Header der Standarbibliothek wäre das umsetzbar, bei externen Bibliotheken wäre das dann doch schwierig.
Bei gcc war das schon immer so, daß libm explizit angegeben werden muß, man hat das beibehalten. Ich kann nur vermuten, daß in grauer Vorzeit, als FPUs noch selten waren, verschiedene Implementierungen da waren, und man dadurch leicht (bei gleichem Header) verschiedene Varianten der Bibliothek einbinden konnte.
So konnte man dann im Zweifelsfall auf Systemen ohne FPU auf eine Bibliothek ohen FPU-Intruktionen zurückgreifen, notfalls indem man ein 'relink' machte?
Fehlerhafter Aufruf des Compilers, der Linker kann ein Smybol nicht finden. Versuch mal -lmath hinzuzufügen...
Und bitte, Fehlermeldungen in Originalsprache (C locale).
Nachtrag *hust* laut man-page -lm
Wieso sollen wir das ohne den Code zu kennen lösen?
Einige Compiler linken tatsächlich automatisch die Standard libm. Aber es ist schon üblich, daß Du beim Einbinden einer Bibliothek diese explizit angeben mußt, denn woher soll der Compiler aus dem Einbinden von weiterem Quelltext ableiten, welche Bibliotheken denn nun zu linken sind?
Da bräuchte es dann einen (implementierungsabhängigen) Syntax, den der Compiler auf Linkeroptionen abbildet.