2016-08-06 64 views
0

Wissen Sie, wie kann ich das gleiche Konzept entwerfen, das gsl verwendet, um Benutzern den Wechsel zwischen verschiedenen cblas-Implementierungen zu ermöglichen?Wie genau hat gsl die alternative cblas-linking-Funktion erreicht?

AFAIK, cblas-Abhängigkeit, von der gsl abhängt, sollte in gsl-Bibliothek fest codiert sein, wenn gsl selbst gebaut wurde.

2.2.2 Verknüpfung mit einer alternativen BLAS Bibliothek

Die folgende Befehlszeile zeigt, wie Sie würde die gleiche Anwendung mit einer alternativen cblas Bibliothek libcblas.a verknüpfen,

$ gcc example.o -lgsl -lcblas -lm 

Für die beste Leistung Eine optimierte plattformspezifische CBLAS-Bibliothek sollte für -lcblas verwendet werden. Die Bibliothek muss dem Standard CBLAS entsprechen. Das ATLAS-Paket enthält eine portable Hochleistungs-BLAS -Bibliothek mit einer CBLAS-Schnittstelle. Es ist freie Software und sollte für jede Arbeit installiert werden, die schnelle Vektor- und Matrixoperationen erfordert. Die folgende Befehlszeile mit der ATLAS-Bibliothek verbinden wird und seinen cblas Schnittstelle,

$ gcc example.o -lgsl -lcblas -latlas -lm 

Wenn die ATLAS-Bibliothek in einem Nicht-Standard-Verzeichnis installiert wird, um die -L Option verwenden, um den Suchpfad hinzuzufügen, wie oben beschrieben.

Weitere Informationen zu BLAS-Funktionen finden Sie unter BLAS-Unterstützung.

Antwort

-1

Blas Bibliothek

gcc -c -Wall -Werror -fpic blas.cpp 

gcc -shared -o libblas.so blas.o 

GSL-Bibliothek, die tatsächlich verwendet blas aber wir keine Verbindung zwischen ihm

gcc -c -Wall -Werror -fpic gsl.cpp 

gcc -shared -o libgsl.so gsl.o 

Beispiel Anwendung, die gleichzeitig mit gsl und blas verbindet

gcc -Wall -o main main.cpp -L../mygsl -lgsl -L../mycblas -lblas 
1

Es gibt kein spezielles Konzept hier - nur mehrere Bibliotheken, die die gleiche API implementieren und dieselbe ABI haben.

Mit anderen Worten, Sie schreiben ein Programm, das die Funktion int do_stuff(char*) von #include foo.h verwendet. Libfoo.so ist ein freigegebenes Bibliotheksobjekt, das das Symbol int do_stuff(char*) exportiert, da es aus einem Programm generiert wurde, das eine Implementierung von int do_stuff(char*) enthält.

Wenn Sie jetzt eine zweite Bibliothek schreiben, die alle die gleichen Symbole implementiert, die libfoo hat, dann haben Sie etwas, das Sie in libfoo 's Platz verwenden können.

Das ist alles, was hier glückt. GSL verwendet BLAS-Symbole. BLAS definiert, was diese Symbole genau sind (lesen Sie: ihre C-Funktionssignatur), so dass Sie die gewünschte BLAS-Implementierung verwenden können. (Vorausgesetzt, alle mit kompatibelem Compiler/Linker gebaut)

+0

Ja, Sie sind richtig. Ich war ein wenig verwirrt, wie ich die gsl-Bibliothek erstellen konnte, ohne explizit auf die Bibliothek von blas zu verweisen und sie auf die Anwendungsentwicklungszeit zu verschieben. Ich habe einen schnellen Test gemacht, um Ihren Anspruch zu bestätigen und es funktioniert. Vielen Dank. –