Nagian
Anmeldungsdatum: 30. Mai 2006
Beiträge: 54
Wohnort: Altach
|
Hallo, ich verwende zum C Programmieren Eclipse mit CDT. Ich habe also ein Managed Make C-Projekt erstellt, und folgendes Programm geschrieben: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 | #include <stdio.h>
#include <math.h>
int main()
{
char zeile[100];
int a, b, c;
double res;
//Introduction
printf("Dieses Programm berechnet Ihnen die Seite eines rechtwinkligen Dreiecks, unter Angaben der beiden anderen Seiten.\n");
printf("Die zu berechnende Seite kennzeichnen Sie mit der Eingabe einer \"0\".\n");
//Input
printf("a: ");
fgets(zeile, sizeof(zeile), stdin);
sscanf(zeile, "%d", &a);
printf("b: ");
fgets(zeile, sizeof(zeile), stdin);
sscanf(zeile, "%d", &b);
printf("c: ");
fgets(zeile, sizeof(zeile), stdin);
sscanf(zeile, "%d", &c);
//Calculate
if(a == 0)
{
res = pow(c, 2) - pow(b, 2);
}
else if(b == 0)
{
res = pow(c, 2) - pow(a, 2);
}
else if(c == 0)
{
res = pow(a, 2) + pow(b, 2);
}
res = sqrt(res);
printf("%f", res);
return 0;
}
|
So schön so gut. Allerdings wird das Ganze beim Kompilieren immer mit folgender Fehlermeldung beendet:
**** Build of configuration Debug for project Square ****
make -k all
Building file: ../main.c
Invoking: GCC C Compiler
gcc -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"main.d" -MT"main.d" -o"main.o" "../main.c"
Finished building: ../main.c
Building target: Square
Invoking: GCC C Linker
gcc -o"Square" ./main.o
./main.o: In function `main':
/home/daniel/Programmieren/Uebungen/Square/Debug/../main.c:41: undefined reference to `sqrt'
collect2: ld gab 1 als Ende-Status zurück
make: *** [Square] Fehler 1
make: Das Target »all« wurde wegen Fehlern nicht aktualisiert.
Build complete for project Square
Nun habe ich schon im Internet recherchiert, und bin daraufgekommen dass ich noch als zusätzlichen Parameter -lm angeben muss.
Dazu habe ich noch 2 Fragen: 1. Wo kann ich in Eclipse diese Option übergeben? 2. Warum muss ich diese Bibliothek noch extra einbinden? Ich bin Visual Studio gewohnt, und wenn ich dort zum Beispiel math.h einbinde funktioniert alles reibungslos. Schon mal vielen Dank!
|
Hello_World
Anmeldungsdatum: 13. Juni 2006
Beiträge: 3620
|
Project → Properties → C/C++ Build → Tab "Tool Settings" → GCC C++ Linker → Libraries Der Visual Studio-Compiler unterstützt ein pragma, mithilfe dessen man dem Compiler mitteilen kann, dass gegen eine bestimmte Bibliothek gelinkt werden muss, möglicherweise wird dieser Mechanismus hier verwendet. Oder aber, die Mathematik-Bibliothek ist unter Windows einfach in der Standardbibliothek enthalten, gegen die ohnehin gelinkt wird.
|
Nagian
(Themenstarter)
Anmeldungsdatum: 30. Mai 2006
Beiträge: 54
Wohnort: Altach
|
Vielen Dank, das funktioniert! Aber es bleibt immer noch die Frage offen warum das unter Visual Studio doch noch ein Stück komfortabler ist...
|
Hello_World
Anmeldungsdatum: 13. Juni 2006
Beiträge: 3620
|
Nagian schrieb: Vielen Dank, das funktioniert! Aber es bleibt immer noch die Frage offen warum das unter Visual Studio doch noch ein Stück komfortabler ist...
Der Visual Studio-Compiler unterstützt ein pragma, mithilfe dessen man dem Compiler mitteilen kann, dass gegen eine bestimmte Bibliothek gelinkt werden muss, möglicherweise wird dieser Mechanismus hier verwendet. Oder aber, die Mathematik-Bibliothek ist unter Windows einfach in der Standardbibliothek enthalten, gegen die ohnehin gelinkt wird.
Wenn dieser Komfort für Dich nennenswert ist, dann solltest Du wohl lieber nicht C Programmieren. Da gibt es nämlich noch weit schlimmere Produktivitätshindernisse.
|
Nagian
(Themenstarter)
Anmeldungsdatum: 30. Mai 2006
Beiträge: 54
Wohnort: Altach
|
Mir ist durchaus klar dass C programmieren kein leichtes Unterfangen ist, habe auch schon mehr als dieses kleine Beispiel programmiert, sollte nur zur Einarbeitung in die IDE dienen. Und zu wissen warum sowas funktioniert schadet sicher auch nicht ☺
|
guude4
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 80
|
Guten Tag, ich habe exakt das gleiche Problem, habe die Einstellungen für den Linker gefunden aber komme nun an diesem Punkt nicht weiter, da ich leider die Pfad nicht kenne, den ich eintragen muss. Wie kann ich diesen herausfinden? Und warum müssen beim Compiler keine Pfade eingetragen werden? Herausgefunden habe ich, dass es funktioniert, wenn man ein "m" als Pfad einträgt - aber warum funktioniert das? Kann man diese Einstellungen auch global für alle neuen Projekte vornehmen? Vielen Dank!
Chris
|
lubux
Anmeldungsdatum: 21. November 2012
Beiträge: 13932
|
guude4 schrieb: Herausgefunden habe ich, dass es funktioniert, wenn man ein "m" als Pfad einträgt - aber warum funktioniert das?
"m" als Pfad, oder doch als library? Siehe z. B. auch:
ls -la /usr/lib/$(uname -i)-linux-gnu | grep -i libm.so
|
guude4
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 80
|
lubux schrieb: "m" als Pfad, oder doch als library?
als library.
|
lubux
Anmeldungsdatum: 21. November 2012
Beiträge: 13932
|
guude4 schrieb: als library.
OK. D. h., deine IDE kennt bereits die Pfade der libraries & Co. .
|
guude4
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 80
|
|