最近需要更改一段C++的程序,其中使用到了C語言的線性代數庫lapack,在window上的使用(在官網下載的CLAPACK-3.1.1-VisualStudio版本,打開工程分別編譯,將生成的lib路徑和文件放入到工程屬性的鏈接器中),成功運行。但是在linux上安裝時,卻遇到了問題,糾結了很久,現在終於解決了,貼出來僅供參考!
一、問題描述:
目的是在動態鏈接庫中使用lapack庫,但是編譯的時候卻遇到了這樣的問題(安裝過程見參考鏈接,這篇文章寫得挺清楚的,本人下載的版本為lapack-3.2.1-CMAKE,可在linux上跨平台使用):

二、分析問題:
1.這個問題是由於引入的模塊沒有使用-fPIC(代碼獨立)進行編譯。但是在什么地方更改?由於更改程序的需求,下載的版本為lapack-3.2.1-CMAKE版本的,因為這個之前的版本的頭文件為lapack.h和f2c.h但是之后的版本進行了升級編程了lapacke.h,所以版本不考慮更換。
2.在這個版本中的編譯文件由兩部分組成make.inc和makeFile,make.inc中有CFLAS參數(-fPIC是在這個參數中設置的),各個模塊中的makeFile文件都有使用這個make.inc文件的配置,那么這個是需要更改的關鍵參數。
3.如果只有這一個參數需要更改的地方,則會成功,否則,需要進一步的分析README.install。
//按照2去測試,發現運行之后還是會報這種錯誤
4.分析F2CLIBS文件下的makeFile的內容,發現有兩處需要主要的地方,在生成f2clib.so鏈接庫的時候,需要將make.inc中的CFLAS參數加上-fPIC和-DNON_UNIX_STDIO
//按照4去測試,發現仍是會有這樣的錯誤,但是提示的錯誤略有不同,不同在於liblapack.a(slamch.o)不能讀取
5.查找這個文件,發現是在INSTALL文件下,那么錯誤很有可能是在這個配置文件中,發現在這個.o生成的時候並沒有引入-fPIC,而是使用了$(NOOPT),而在make.inc中NOOPT的設置為-O0,所以還要在這個地方進行變動。
//按照5去測試,發現成功,可以正常生成.so文件。
三、解決問題:
總結一下需要配置的地方和如何使用
1.需要更改的配置:
F2CLIBS的makeFile中

在INstall的makeFile里


make.inc里

2.測試代碼testf2c.cpp
#include<iostream> using namespace std; #include "f2c.h" //因為程序是C++,而CLAPACK是C語言寫的,所以在此處用extern關鍵字 extern"C" { #include<clapack.h> } int main(void) { integer M=3 ; integer N=1; real a[9]={4,3,11,2,-1,0,-1,2,3}; real b[3]={2,10,8}; integer lda; integer ldb; integer INFO; lda=M; ldb=M; integer ipiv[M]; sgesv_(&M, &N, a, &lda,ipiv, b, &ldb, &INFO); if(INFO==0) { for(int i=0;i<M;i++) { cout<<b[i]<<endl; } } else { cout<<"Failed."<<endl; } return 0; }
3.生成動態庫
g++ -fPIC -shared testf2c.cpp -llapack -lblas -lf2c -o testf2c.so
4.不使用-fPIC和-shared結果為:
[root@VM_26_152_centos test]# ./test.so
-14
56
54
參考:http://blog.csdn.net/zxd675816777/artical/details/39484499
