在win的VS2015下编译SuperLU与BLAS的静态库
感谢 m0_38075933
指出标题命名的错误,原先标题是“动态库”,实则是“静态库”。
NOTICE 本文是在window8.1环境下使用VS2015编译SuperLU与BLAS的静态库(因为最近有个项目依赖SuperLU和BLAS),本文将会说明编译静态库的详细过程,以及编译过程中遇到的错误,还有为了跳过错误而做的修改,SuperLU与BLAS的原理本文一概不知,实在抱歉。在下面的相关阅读里面,有我参考的资料,实际上也没什么帮助,因为生成静态库也就那几步,不过还是在此表示感谢。
相关阅读
编译SuperLU虽然本链接已经无法访问了。
编译
1.下载源码
百度SuperLU点第一个就可以了,这里还是贴出地址SuperLU: Home Page,github地址xiaoyeli/superlu,目前(我所见)最新的Download software (v5.2.1)。
这个SuperLU项目里面还有高性能计算版本的,我用的是最普通的版本,没有使用SuperLU_MT和SuperLU_DIST,不好意思,学识短浅,不明所以。
2.编译
SuperLU
- 挪源码到VS项目
首先打开VS2015,新建一个空解决方案,然后再将下载下来的压缩包(例如我的叫superlu_5.2.1.tar.gz)里面的’‘./SRC’'的所有文件拷到空解决方案的空项目里面。
然后按上图所示,把源码包含到本项目中,这样就可以进入下一步了。
- 修改“配置属性-常规”的“项目默认值-配置类型”为“静态库(.lib)”,注意你是需要生成64位还是32位的,是debug版还是release版,这些在后续使用中都是有区别的,如下图所示。
- 重新生成
点绿箭头也可以,让编译器运行起来,然后就会出现喜闻乐见的错误了,如果这里你生成的是release版本的话,编译器竟然居然在报错的情况下能够生成.lib,不过在使用的时候,你还是会报错的,这一点需注意。
4) 喜闻乐见的报错
一共有两类错误:一是SuperMatrix *AA
类没有赋值,二是整型变量int j
没有赋值,每类错误有4处,共8个未赋值错误。
对于SuperMatrix *AA
而言,仔细阅读代码,就能发现在大概188到190行else语句处(每处AA都是同样的问题),的确if以后,AA就没有赋值过,在没有充分了解SuperLU的原理前,私自修改代码是愚笨的,但我并没有更多的时间去研究整个代码了,所以就只能硬着头皮上了,死马当活马医,期待我的项目里面并没有用到这一条函数操作。修改如下,在if下面加了个else语句:*else AA = (SuperMatrix )SUPERLU_MALLOC(sizeof(SuperMatrix));
else {
if ( A->Stype == SLU_NC ) AA = A;
else AA = (SuperMatrix *)SUPERLU_MALLOC(sizeof(SuperMatrix));
}
其余AA的修改均一致。
而对于int j
,同理,一边 祈祷项目没有用到这部分,一边给j赋值0。这样一来,就可以跑通了,正常生成superlu的.lib文件。
当然,你还会遇到***_CRT_SECURE_NO_WARNINGS***的问题,这个不算问题吧,在“预处理器定义”里面加上就可以了。
BLAS
由于
由于SuperLu需要调用BLAS库中的一些函数,所以需要编译BLAS库,SuperLU官网上说BLAS库速度不快,可以使用推荐的Intel MKL、ATLAS, or Goto BLAS
这里仅以SuperLU下载之后文件中带的BLAS为例编译,即使之前有编译好的BLAS,也最好是用SuperLU文件夹中带的BLAS编译,减少出错的可能性。
因此还需要生成BLAS的静态库,我的项目里面也明确写了需要BLAS,那就依葫芦画瓢干起来吧。
- 挪源码到VS项目
这里的BLAS源码是放在’‘./CBLAS’'里面的,同理拷过去就可以了。
-
修改
-
重新生成
4) 喜闻乐见的报错
integer a_dim1
并没有赋值,还是上句老话,在没有充分了解SuperLU的原理前,私自修改代码是愚笨的,但没办法啊,给a_dim1赋个0吧:
a_dim1 = 0;
全部修改后,BLAS的静态库就可以生成了,这里需要注意的是,后续使用时,x64和x86需要区分,SuperLU和BLAS需要版本需要一致。
使用
使用的时候注意不要把SuperLU和BLAS生成静态库的源码给删掉了,因为在后续项目使用它们时候,需要引用这些源码。那举个例子,例如我在我的项目中如果要使用SuperLU和BLAS时该怎么办呢?
打开项目属性,一,在“配置属性-VC++目录”的“库目录”里添加你放SuperLU和BLAS的lib文件的地址,比如我把两个lib放到C:\superLU_5.2.1
里面了,所以这个路径需要添加到库目录里,来告诉VS要用的lib的位置;二,在“配置属性-链接器-输入”中的“附加依赖项”里面添加SuperLU和BLAS的lib,这里我为了区分release和debug版本,所以在debug版本后面加了个d以示区分。详细如下图所示。
以上就是全部内容,这算是我的一个记录,里面如果有什么错误还请大家指出,特别是修改代码那部分,我看其他的关于SuperLU的教程都没有提到还要改代码这样的事,而源码作者是在linux系统做的工作,所以多少会有出入,所以所以,我也不知道了,谢谢。