4

我正在尝试编写一个应该在 C++ 程序中使用 C 库(LIS 库)的程序。结构对象的创建/初始化似乎存在问题。

当我在 wikipediapage 上运行示例程序时:http ://en.wikipedia.org/wiki/Lis_%28linear_algebra_library%29它运行起来就像一个魅力,但当然它被编译为 C 程序。

在我的 C++ 代码中,我这样做如下:

#include "stdafx.h"
#include <iostream>

extern "C"
{
#include "lis.h"
#include "lis_config.h"
    LIS_MATRIX A;

}
using namespace std;


int main(LIS_INT argc, char* argv[])
{
    lis_initialize(&argc, &argv);
    lis_matrix_create(LIS_COMM_WORLD, &A);
    getchar();

    return 0;
}

当我运行此代码时,它在 lis_matrix_create 行给我一个访问冲突。似乎 A 有一个内存地址,它的数据成员(LIS_MATRIX 在 Lis.h 中定义为一个结构)尚未初始化,因此它们的地址为 NULL。

您能否告诉我如何创建 LIS_MATRIX,以便我可以像在维基百科页面上的示例代码中那样使用它?

先感谢您!

回复 Adam 和 Ross Ridge:我在 Windows 7 64 位上使用 Visual Studio 2013。Lis 库的手册说它兼容 Visual Studio 2008、2010 和 2012 编译器,也兼容 gcc 3.4 和 4.4 以及一些 IBM、Intel 和 PGI C++ 编译器,我希望 Visual Studio 2013 不会有问题。

此外,在这段代码中,如果我取出“extern C”块,并包含“stdio.h”而不是 iostream,它运行没有问题(所以我猜这意味着使用了 C 编译器?)。在我还包括 iostream 的那一刻,访问冲突就开始了。

4

1 回答 1

1

你包括

lis_config.h

lis.h

这本身就是一个错误(你必须先包含它)。此外,如果您触及 lis_config 中的任何内容,则必须重建整个库(使用项目的大多数相同编译器标志,例如,如果您使用 SSE2,则使用“-msee2”)。在重建之前只是交换标题只是为了看看这是否足够..

多说几句:一个库可以很容易地检测包含错误顺序的标头,为此向 lis 开发人员开一张票。

于 2014-08-14T07:00:13.830 回答