使用blas、lapack和openmp处理gcc 4.9的C代码,但在gcc 6中出现运行时错误



我用C.写了一段代码

你可以在这里找到源代码。

它利用了blas、lapack和openmp库。

我按照这些说明编译了blas和lapack库。

我使用这些标志来告诉编译器它应该链接的库:-lblas -llapack -fopenmp

我使用的是gcc 4.9,程序可以正确运行。

最近,我将gcc更新为gcc6,它显示了许多关于blas和lapack函数隐式声明的警告消息:

src/PSIRWLS-train.c:152:17: warning: implicit declaration of function 'dgemm_' [-Wimplicit-function-declaration]
                 dgemm_(&trans, &trans, &(dataset.l), &ncols, &size,&factorA, KSC, &(dataset.l), miZ, &size, &factor, miKSM, &(dataset.l));

当我运行应用程序时,会出现分段错误。

我完全不知道gcc 4.9和gcc 6的区别,你知道对此有什么解释吗?

问题已解决。

1-gcc 4和6中的一些默认标志不同。gcc6显示警告,当你不以这种方式清除blas和lapack功能时:

外部空隙dgemm_(…(

2-它让我完成了一个必须初始化为0的变量的初始化。我编码int I,j=0;当我必须对int进行编码时,I=0,j=0;

gcc 4将i初始化为0(并且程序运行正确(,而gcc 6没有(由于这些变量要索引,因此产生了分段错误(

我曾经遇到过类似的问题,您的代码中似乎有一些未定义的行为(例如双自由(,这是以编译器特定的方式处理的。也许这在gcc 4.9和6.0之间发生了变化。

在不了解代码的情况下很难说,但你可以自己使用许多工具来跟踪这个问题,例如GDB,尤其是valgrind的memcheck(对我来说效果很好(:

valgrind --tool memcheck <your binary here>

这将报告代码中与内存相关的错误和未定义行为的位置。

相关内容

  • 没有找到相关文章

最新更新