在win的VS2015下编译SuperLU与BLAS的静态库

本文介绍如何在Windows 8.1环境下使用VS2015编译SuperLU与BLAS静态库,包括详细步骤、遇到的错误及解决方法。适用于需要依赖这两个库进行项目的开发者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在win的VS2015下编译SuperLU与BLAS的静态库

感谢 m0_38075933指出标题命名的错误,原先标题是“动态库”,实则是“静态库”。


NOTICE 本文是在window8.1环境下使用VS2015编译SuperLU与BLAS的静态库(因为最近有个项目依赖SuperLU和BLAS),本文将会说明编译静态库的详细过程,以及编译过程中遇到的错误,还有为了跳过错误而做的修改,SuperLU与BLAS的原理本文一概不知,实在抱歉。在下面的相关阅读里面,有我参考的资料,实际上也没什么帮助,因为生成静态库也就那几步,不过还是在此表示感谢。


相关阅读

SuperLU使用总结

编译SuperLU虽然本链接已经无法访问了。


编译

1.下载源码

百度SuperLU点第一个就可以了,这里还是贴出地址SuperLU: Home Page,github地址xiaoyeli/superlu,目前(我所见)最新的Download software (v5.2.1)

这个SuperLU项目里面还有高性能计算版本的,我用的是最普通的版本,没有使用SuperLU_MTSuperLU_DIST,不好意思,学识短浅,不明所以。

2.编译

SuperLU
  1. 挪源码到VS项目

首先打开VS2015,新建一个空解决方案,然后再将下载下来的压缩包(例如我的叫superlu_5.2.1.tar.gz)里面的’‘./SRC’'的所有文件拷到空解决方案的空项目里面。

挪源码到VS项目

然后按上图所示,把源码包含到本项目中,这样就可以进入下一步了。

  1. 修改“配置属性-常规”的“项目默认值-配置类型”为“静态库(.lib)”,注意你是需要生成64位还是32位的,是debug版还是release版,这些在后续使用中都是有区别的,如下图所示。

配置属性

  1. 重新生成

点绿箭头也可以,让编译器运行起来,然后就会出现喜闻乐见的错误了,如果这里你生成的是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,那就依葫芦画瓢干起来吧。

  1. 挪源码到VS项目

这里的BLAS源码是放在’‘./CBLAS’'里面的,同理拷过去就可以了。

  1. 修改

  2. 重新生成

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系统做的工作,所以多少会有出入,所以所以,我也不知道了,谢谢。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值