2016-08-06 19 views
0

你知道我該如何設計gsl用來允許用戶在各種cblas實現之間切換的相同概念?gsl如何實現替代cblas鏈接功能?

AFAIK,當gsl本身構建時,gsl依賴的cblas依賴應該已被硬編碼到gsl庫中。

2.2.2一個替代BLAS庫鏈接

下面的命令行顯示瞭如何與替代CBLAS庫libcblas.a連結相同 應用,

$ gcc example.o -lgsl -lcblas -lm 

對於最佳性能優化平臺特定的CBLAS庫 應該用於-lcblas。圖書館必須符合CBLAS 標準。 ATLAS軟件包提供具有CBLAS接口的便攜式高性能BLAS 庫。它是免費軟件,並且應該安裝 以用於任何需要快速向量和矩陣操作的工作。 下面的命令行會與ATLAS庫及其 CBLAS接口鏈路,

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

如果ATLAS庫安裝到非標準目錄使用 -L選項將其添加到搜索路徑,如上所述。

有關BLAS功能的更多信息,請參閱BLAS支持。

回答

-1

布拉斯庫

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

gcc -shared -o libblas.so blas.o 

GSL庫,這實際上是用BLAS,但我們不鏈接到它

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

gcc -shared -o libgsl.so gsl.o 

例同時鏈接gsl和blas的應用程序

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

這裏沒有特別的概念 - 只有多個庫實現相同的API並具有相同的ABI。

換句話說,您編寫的程序使用的功能int do_stuff(char*)#include foo.hLibfoo.so是一個共享庫對象,它導出符號int do_stuff(char*),因爲它是從包含int do_stuff(char*)的實現的程序生成的。

如果您現在編寫第二個庫,它實現libfoo所具有的所有相同符號,那麼您在libfoo的位置上可以使用某些東西。

這就是這裏所有的煩惱。 GSL使用BLAS符號。 BLAS定義了這些符號到底是什麼(讀取:它們的C函數簽名),因此您可以使用您想要的任何BLAS實現。 (假設所有與兼容的編譯器/連接器內置)

+0

是的,你是對的。我有點困惑,如何構建gsl庫而不明確鏈接到blas庫並將其推遲到應用程序構建時間。我做了一個快速測試,以驗證您的聲明,它的工作原理。謝謝。 –