基于VS2017的C++ && SuperLU混合编程

一、SuperLU介绍

SuperLU:是一个通用库,用于直接求解大型稀疏非对称线性方程组。该库是用C编写的,可以从C或Fortran程序调用。它使用MPI、OpenMP和CUDA来支持各种形式的并行性。它支持实数据类型和复杂数据类型、单精度和双精度以及64位整数索引。库例程使用部分旋转执行LU分解,三角系统通过正向和反向替换进行求解。LU分解例程可以处理非方矩阵,但三角解仅对方矩阵执行。矩阵列可以通过库或用户提供的例程进行预排序(分解前)。这种稀疏性的预排序完全独立于因式分解。为提高向后稳定性,提供了工作精度迭代求精子程序。还提供了使系统平衡、估计条件数、计算相对后向误差和估计精化解的误差界的例程。

官网下载SuperLU文件地址:http://crd-legacy.lbl.gov/~xiaoye/SuperLU/

二、生成SuperLU静态库文件

1、 生成SuperLU.lib

2.1.1、新建项目

我已经下载了SuperLU相关文件到D:\other-systems\SUPERLU\SuperLU目录下
此处为了方便后期使用SuperLU库,项目命名为SuperLU。
在这里插入图片描述
新建项目之后将之前下好的D:\other-systems\SUPERLU\SuperLU\SRC 中的所有的.c文件添加到项目源文件文件夹中,所有的.h文件添加到项目头文件文件夹中。
在这里插入图片描述
在这里插入图片描述

2.1.2、配置属性

项目右键—>属性
在这里插入图片描述
工程的属性-> C/C+±>常规->附加包含目录中添加D:\other-systems\SUPERLU\SuperLU\SRC 文件夹路径
在这里插入图片描述
然后在工程 右击 -> 属性 -> 配置属性 -> 常规-> 配置类型-> 选择 静态库(.lib)单击确定。
在这里插入图片描述
或者在建立工程的时候选择直接创建静态库;
在这里插入图片描述

2.1.3、编译

在Debug模式调试编译无error后生成Release版本,直接编译会出现以下错误
在这里插入图片描述
原因是Visual C++ 2017 使用了更加安全的 run-time library routines 。新的Security CRT functions(就是那些带有“_s”后缀的函数),请参见:《CRT函数的安全增强的版本》
下面给出这个问题的解决方案:
方法一:将原来的旧函数替换成新的 Security CRT functions。
方法二:用以下方法屏蔽这个警告:
1. 在预编译头文件stdafx.h里(注意:一定要在没有include任何头文件之前)定义下面的宏:
#define _CRT_SECURE_NO_DEPRECATE
2. 或声明 #pragma warning(disable:4996)
3. 更改预处理定义:
项目->属性->配置属性->C/C++ -> 预处理器 -> 预处理器定义,增加: _CRT_SECURE_NO_DEPRECATE
在这里插入图片描述

做以上修改之后又出现以下错误
在这里插入图片描述
原因
在VS2017创建项目时,会有一个勾选项,叫做“安全开发生命周期(SDL)检查”,这个东西是微软在VS2012新推出的东西,为了是能更好的监管开发者的代码安全,如果勾选上这一项,那么他将严格按照SDL的规则编译代码,会有一些以前常用的函数无法通过编译,比如在VS2010中的scanf是warning那么在VS2017中就是error了。
也就是在编译的时候,当SDL检查启用时,编译器会严格检测缓冲区的溢出,并且会在delete某个指针时,自动为这个指针定义一个非有效的值,防止在delete以后仍用到这个指针时出错。还有就是会在你定义一个对象时,自动为这个对象赋值零。
从这些功能来看,有些功能还是不错的,不但方便了程序员使用也增强了程序的健壮性,但是对老版本程序的兼容就会出现问题,以前程序中编译通过的内容也许在VS2012中就没有办法通过。
解决办法:
问题解决方法:
有一个选择打开和关闭SDL检查的位置就是:项目属性->配置属性->C/C+±>SDL检查,选测是或者否。
此时我们选择”否”,则上面的那个错误就不会出现了
在这里插入图片描述
再编译就不会出错了
在这里插入图片描述
此时我们改为生成Release版本编译
在这里插入图片描述
在Release文件下生成了SuperLU.lib
在这里插入图片描述

2、 生成SuperLU.lib

2.2.1、新建项目

此处为了方便后期使用BLAS库,项目命名为BLAS。
由于SuperLU需要调用BLAS库中的一些函数,所以需要编译BLAS库。SuperLU官网上说BLAS库速度不快,推荐使用Intel MKL、ATLAS、GotoBLAS。为方便仅以SuperLU下载文件中附带的CBLAS文件夹下的BLAS为例编译,BLAS的编译与前者SuperLU类似。
1) 新建工程(命名BLAS),将D:\other-systems\SUPERLU\SuperLU\CBLAS文件夹下的头文件和源文件添加到工程文件目录中,然后将工程属性改为静态库(.lib)。
在这里插入图片描述
2) 将D:\other-systems\SUPERLU\SuperLU\CBLAS添加到 项目 -> 属性 -> C/C++ -> 常规 -> 附加包含目录;
3) 在Debug模式下调试编译,成功后生成Release版本。
编译过程中遇到以上问题的解决办法一样。
在这里插入图片描述

3、 调用SuperLU.lib库

2.3.1、新建mySuperLU项目,并配置SuperLU库

(1)将路径 D:\other-systems\SUPERLU\SuperLU\SRC添加到 项目属性 —> VC++目录 —>包含目录中,将之前编译好的SuperLU.lib(release文件夹下)和BLAS.lib(release文件夹下)复制到E:\programmer\mySuperLU\Debug文件夹下,没有的话可以新建,然后将E:\programmer\mySuperLU\Debug路径添加到项目属性 —> VC++目录 —>库目录中;
在这里插入图片描述
(2) 再把路径E:\programmer\SuperLU\Release(此路径下包含文件SuperLu.lib)和路径E:\programmer\SuperLU\Release(此路径下包含文件BLAS.lib)添加到项目属性 —> 链接器 —>常规—>附加库目录中;
在这里插入图片描述

(3)将SuperLU.lib和BLAS.lib添加到项目属性—>链接器—>输入—>附加依赖项—>编辑—>附加依赖项—>确定。
在这里插入图片描述

2.3.2、调用方法

代码来源于SuperLU Package.(新建mySuperLU.c文件)

#include "stdafx.h"
#include "slu_ddefs.h"
 
void main(int argc, char *argv[])
{
	/*
	* Purpose
	* =======
	*
	* This is the small 5x5 example used in the Sections 2 and 3 of the
	* Users' Guide to illustrate how to call a SuperLU routine, and the
	* matrix data structures used by SuperLU.
	*
	*/
	SuperMatrix A, L, U, B;
	double   *a, *rhs;
	double   s, u, p, e, r, l;
	int      *asub, *xa;
	int      *perm_r; /* row permutations from partial pivoting */
	int      *perm_c; /* column permutation vector */
	int      nrhs, info, i, m, n, nnz, permc_spec;
	superlu_options_t options;
	SuperLUStat_t stat;
 
	/* Initialize matrix A. */
	m = n = 5;
	nnz = 12;
	if (!(a = doubleMalloc(nnz))) ABORT("Malloc fails for a[].");
	if (!(asub = intMalloc(nnz))) ABORT("Malloc fails for asub[].");
	if (!(xa = intMalloc(n + 1))) ABORT("Malloc fails for xa[].");
	s = 19.0; u = 21.0; p = 16.0; e = 5.0; r = 18.0; l = 12.0;
	a[0] = s; a[1] = l; a[2] = l; a[3] = u; a[4] = l; a[5] = l;
	a[6] = u; a[7] = p; a[8] = u; a[9] = e; a[10] = u; a[11] = r;
	asub[0] = 0; asub[1] = 1; asub[2] = 4; asub[3] = 1;
	asub[4] = 2; asub[5] = 4; asub[6] = 0; asub[7] = 2;
	asub[8] = 0; asub[9] = 3; asub[10] = 3; asub[11] = 4;
	xa[0] = 0; xa[1] = 3; xa[2] = 6; xa[3] = 8; xa[4] = 10; xa[5] = 12;
 
	/* Create matrix A in the format expected by SuperLU. */
	dCreate_CompCol_Matrix(&A, m, n, nnz, a, asub, xa, SLU_NC, SLU_D, SLU_GE);
 
	/* Create right-hand side matrix B. */
	nrhs = 1;
	if (!(rhs = doubleMalloc(m * nrhs))) ABORT("Malloc fails for rhs[].");
	for (i = 0; i < m; ++i) rhs[i] = 1.0;
	dCreate_Dense_Matrix(&B, m, nrhs, rhs, m, SLU_DN, SLU_D, SLU_GE);
 
	if (!(perm_r = intMalloc(m))) ABORT("Malloc fails for perm_r[].");
	if (!(perm_c = intMalloc(n))) ABORT("Malloc fails for perm_c[].");
 
	/* Set the default input options. */
	set_default_options(&options);
	options.ColPerm = NATURAL;
 
	/* Initialize the statistics variables. */
	StatInit(&stat);
 
	/* Solve the linear system. */
	dgssv(&options, &A, perm_c, perm_r, &L, &U, &B, &stat, &info);
 
	dPrint_CompCol_Matrix("A", &A);
	dPrint_CompCol_Matrix("U", &U);
	dPrint_SuperNode_Matrix("L", &L);
	print_int_vec("\nperm_r", m, perm_r);
	dPrint_Dense_Matrix("B", &B);
 
	/* De-allocate storage */
	SUPERLU_FREE(rhs);
	SUPERLU_FREE(perm_r);
	SUPERLU_FREE(perm_c);
	Destroy_CompCol_Matrix(&A);
	Destroy_SuperMatrix_Store(&B);
	Destroy_SuperNode_Matrix(&L);
	Destroy_CompCol_Matrix(&U);
	StatFree(&stat);
 
	getchar();
}
 

VS2017C++ const char* 类型的实参与char *类型的形参不兼容解决办法
在这里插入图片描述
解决方法
法1 将结构体中定义的 char * 前面加上 "const"修饰
法2 在Visual Studio 2019右侧栏创建的项目上右击“项目名称”——>“属性”——>“C/C++”——>“语言”,将“符合模式”改为“否”即可。如下所示:
在这里插入图片描述
再编译则可以成功
在这里插入图片描述
参考链接:https://blog.csdn.net/Santorinisu/article/details/80275557
https://blog.csdn.net/jingmiaa/article/details/52344057
https://blog.csdn.net/gindar/article/details/8010794

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Visual Studio 2017(C++ 2017)安装手册说明 1. 安装包下载 安装包下载的方法有多种,可自行在网上查找,这里介绍从官方网站下载 这里以【Community 2017】为例; 下载好的安装包如下; 2. 安装程序 双击打开安装包,安装包打开如下图所示 点击【继续】,进行下一步 等待安装程序加载,安装程序加载完成如下图所示 这里以安装C++ 桌面开发为例(请根据各自需求勾选),点击【安装】进行下一步 这一步需要连网才可以正常进行下一步(因为需求连网下载) 下载安装好之后,会提示重启电脑,点击【重启】进行下一步 3. 打开软件 由于安装时没有在桌面生成快捷方式,因此需要在开始菜单里的所有程序中找到快递方式打开程度,如果是Win10可以直接在这里搜索打开程序 第一次打开软件会提示注册,这里选择【以后在说】 选择开发设置 选择颜色主题之后点击【启动 Visual Studio】 第一次打开如图和创建文件如下图所示: 4. 注册软件 软件默认为30天的试用 建议去注册一个微软账号【如何注册请自行在网上查找】,点击【检查更新的许可证】进行下一步; 输入微软的账号进行登录 登录之后,这里就不在是30天的试用了。个人感觉这样会比用注册机破解的会好一点,至少我们在这里没有修改原始的文件,可以来保证程序是正版 以上仅供参考
### 回答1: VS2017是Microsoft推出的一款集成开发环境,主要用于开发各种类型的软件,而C++则是一种高级编程语言,通常用于开发应用程序。在VS2017中,我们可以使用C++语言进行编程,通过编写源代码、调试代码并生成可执行文件,从而实现各种功能。 使用VS2017进行C++编程有以下几个优点。首先,VS2017提供了丰富的开发工具和库,使得开发者可以更方便地进行编程工作。例如,可以使用可视化的界面进行代码编辑、自动完成、语法高亮等功能,提高了开发效率。其次,VS2017内置了强大的调试工具,可以用于排查代码中的错误和问题,方便进行代码调试和测试,提高代码质量。此外,VS2017还支持多种编译器和构建工具,可以轻松地进行项目管理和构建。 对于初学者来说,使用VS2017进行C++编程还有一些额外的好处。首先,VS2017提供了丰富的文档和学习资源,可以帮助新手更快地入门。其次,VS2017支持自动完成和错误检查功能,可以帮助初学者减少语法错误和逻辑错误。此外,VS2017还提供了在线社区和论坛,方便开发者与其他开发者进行交流和分享经验。 总之,使用VS2017进行C++编程是非常方便和高效的方式。无论是初学者还是有经验的开发者,都可以从VS2017的各种功能和工具中受益,提高开发效率和代码质量。 ### 回答2: VS2017是微软推出的一款集成开发环境,专门用于C语言开发。它提供了强大的工具和功能,便于开发人员编写、调试和部署C语言程序。 首先,VS2017提供了直观的用户界面,使得开发人员可以轻松地在一个集成的环境中进行编码,而无需切换到其他工具。它具有可自定义的布局和快捷键,可以根据个人喜好和工作方式进行设置,提高开发效率。 其次,VS2017提供了丰富的调试工具,可以帮助开发人员快速定位和解决代码中的错误。它支持逐行调试、断点调试、堆栈追踪等功能,能够帮助开发人员深入了解代码的执行过程,快速找到问题所在。 此外,VS2017还集成了版本控制系统,如Git,方便多人协作开发,确保代码的安全性和稳定性。开发人员可以方便地查看代码的修改记录、合并不同的代码版本,并且能够轻松地回滚到之前的版本。 最后,VS2017还提供了丰富的代码分析工具,能够检测和纠正代码中的潜在问题,如内存泄漏、未使用的变量等。开发人员可以通过这些工具优化代码的质量,提高程序的性能和可靠性。 综上所述,VS2017是一款功能强大的开发工具,适用于C语言的编写和调试。它的直观界面、强大的调试功能、版本控制系统和代码分析工具都能帮助开发人员提高工作效率和代码质量。 ### 回答3: 首先,VS2017是一个集成开发环境,用于开发各种类型的应用程序,包括桌面应用程序、Web应用程序、移动应用程序等。它是由微软公司开发的,是Visual Studio系列产品的最新版本。 VS2017提供了丰富的功能和工具,使开发人员能够更高效地开发和调试应用程序。它具有直观的用户界面,可以轻松地创建、编辑和管理项目。此外,它还提供了许多内置的代码编辑器、调试器和性能分析器,用于帮助开发人员编写高质量的代码。 在VS2017中,我们可以使用多种编程语言进行开发,包括C、C++、C#、Visual Basic等。同时,它还支持多种版本控制系统,如GIT和TFS,方便团队协作。 VS2017还提供了丰富的扩展和插件生态系统,可以帮助开发人员添加新的功能和工具,以满足自己的需求。开发人员可以从Visual Studio市场中下载并安装各种扩展,以增强开发效率和功能。 总之,VS2017是一个功能强大的开发工具,它提供了丰富的功能和工具,帮助开发人员更高效地开发和调试各种类型的应用程序。无论是初学者还是专业开发人员,都可以在VS2017中找到合适的工具和环境,来实现他们的开发目标。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值