使用blas,lapack和openmp使用gcc 4.9的C代码,但是使用gcc 6会产生运行时错误

时间:2016-09-23 11:33:40

标签: runtime-error lapack blas gcc4.9 gcc6

我用C编写了一段代码。

您可以找到源代码here

它使用了库blas,lapack和openmp。

我在these instrucions之后编译了blas和lapack库。

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

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

最近我已经将gcc更新为gcc 6,它显示了很多关于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的差异,您对此有何解释?

2 个答案:

答案 0 :(得分:0)

我曾经有过a similar problem次,而且你的代码中很可能存在一些未定义的行为(例如双重免费),这是以编译器特定的方式处理的。也许这在gcc 4.9和6.0之间发生了变化。

在不知道您的代码的情况下很难说,但是您可以自己使用一些工具来跟踪此问题,例如GDB或特别是valgrind's memcheck(对我来说非常出色地工作) ):

valgrind --tool memcheck <your binary here>

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

答案 1 :(得分:0)

问题解决了。

1 - gcc 4和6中的一些默认标志是不同的。当你不以这种方式取消blas和lapack函数时,gcc 6会显示警告:

extern void dgemm _(...)

2 - 它让我初始化了一个必须初始化为0的变量。  我编码int i,j = 0;  当我不得不编码int i = 0,j = 0;

gcc 4将i初始化为0(并且程序运行正常)并且gcc 6没有(因为这些变量要索引而创建分段错误)