linux(centos6.5)上動態鏈接庫使用lapack庫


最近需要更改一段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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM