[gelöst] GSL Datei kompilieren
-
Hallo ihr Lieben,
ich versuche gerade die GSL für meine Numerik zu verwenden und kriege das ganze leider nicht kompiliert.
Zunächst hatte ich meine Datei rootFinding.cpp versucht einfach mittels
g++ -Wall -pedantic -ansi -o rootFinding rootFinding.cpp
zu kompilieren.
Das ergabe eine ganze Menge Fehlermeldungen:
/tmp/ccZP6usw.o: In function `main': rootFinding.cpp:(.text+0xcf): undefined reference to `gsl_root_fsolver_brent' rootFinding.cpp:(.text+0xdf): undefined reference to `gsl_root_fsolver_alloc' rootFinding.cpp:(.text+0x100): undefined reference to `gsl_root_fsolver_set' rootFinding.cpp:(.text+0x10c): undefined reference to `gsl_root_fsolver_name' rootFinding.cpp:(.text+0x160): undefined reference to `gsl_root_fsolver_iterate' rootFinding.cpp:(.text+0x16f): undefined reference to `gsl_root_fsolver_root' rootFinding.cpp:(.text+0x180): undefined reference to `gsl_root_fsolver_x_lower' rootFinding.cpp:(.text+0x191): undefined reference to `gsl_root_fsolver_x_upper' rootFinding.cpp:(.text+0x1b5): undefined reference to `gsl_root_test_interval' rootFinding.cpp:(.text+0x241): undefined reference to `gsl_root_fsolver_free' collect2: ld returned 1 exit status
Also habe ich die erste Zeile bei google eingegeben, sodass ich recht schnell hier gelandet bin.
Okay, also zurück ins Manual und schauen wie das ganze richtigtm geht.
Das führte mich sehr schnell zu dem Abschnitt über Linkin and Compiling, d.h. ich versuche mein Programm zunächst ohne linken zu kompilieren:
g++ -Wall -I/usr/local/include/gsl -c rootFinding.cpp
Okay, im Manual wird gcc verwendet, ich nehme g++, z.B. laut Stack Overflow der Unterschied zwischen C und C++ ist. Ich hoffe, dass darin nicht das Problem liegt.
Weiterhin fällt mir auf, dass im Manual die der volle Verzeichnispfad genommen wird, sondern lediglich*-I/usr/local/include*. In das Unterverzeichnis der gsl wird also gar nicht mehr reingeschaut.
Ich habe sofort auch diesen Befehl probierg++ -Wall -I/usr/local/include -c rootFinding.cpp
und es funktioniert trotzdem!
Wieso das das?
Auf jeden Fall habe ich jetzt eine Datei namens
rootFinding.o
vorliegen.
Scheint also bisher zu funktionieren.
Jetzt muss ich scheinbar anhand des nächsten Abschnitts der Anleitung die Bibliothek noch einbinden.
In meinem Fall probiere ichg++ -L/usr/local/lib rootFinding.o -lgsl -lgslcblas -lm
Es kommt wieder was bei rum, jetzt habe ich immernoch eine Datei namens
a.out
Aber immernoch keine ausführbare rootFinding Datei? Bin ich noch nicht vollständig am Ziel oder mache ich was falsch?
Vielen Danke im Voraus.
Gruß,
Klaus.
-
schreib dochmal
./a.out //zum ausführen
du hast keinen namen mitgegeben.
(hier ist die auseinandersetzung mit dem linker :))
-
Hi,
[quote="elise"]schreib dochmal
./a.out //zum ausführen
Tatsache, es funktioniert. Da kommt dann eben
using brent method iter [ lower, upper] root err err(est) 1 [1.0000000, 5.0000000] 1.0000000 -1.2360680 4.0000000 2 [1.0000000, 3.0000000] 3.0000000 +0.7639320 2.0000000 3 [2.0000000, 3.0000000] 2.0000000 -0.2360680 1.0000000 4 [2.2000000, 3.0000000] 2.2000000 -0.0360680 0.8000000 5 [2.2000000, 2.2366300] 2.2366300 +0.0005621 0.0366300 Converged: 6 [2.2360634, 2.2366300] 2.2360634 -0.0000046 0.0005666
Ich versuche mich an der numerischen Nullstellensuche.
du hast keinen namen mitgegeben.
Und an welcher Stelle muss das rein? Ersten oder zweiten Befehl? Also gerade noch die Option -o <NAME>, darüber reden wir doch - oder?
EDIT:
Also ich habe es mal mit dem zweiten Befehl probiert, das scheint funktioniert zu habeng++ -L/usr/local/lib -o rootFinding rootFinding.o -lgsl -lgslcblas -lm
Immerhin habe ich keine a.out Datei, sondern eine rootFinding!
Gruß,
Klaus.