使用 blas、lapack 和 openmp 的 C 代码与 gcc 4.9 一起工作,但在 gcc 6 上给出 运行 时间错误

C code that uses blas, lapack and openmp working with gcc 4.9 but gives run time error with gcc 6

我用C写了一段代码

您可以找到源代码here

它使用了库 blas、lapack 和 openmp。

我已经按照 these instrucions.

编译了 blas 和 lapack 库

我使用这些标志告诉编译器它应该 link 的库:​​-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 的区别,你知道这方面的任何解释吗?

我曾 一次,您的代码中很可能存在一些未定义的行为(例如双重释放),这些行为以编译器特定的方式处理。也许这在 gcc 4.9 和 6.0 之间发生了变化。

不知道你的代码很难说,但你可以自己使用一些工具来追踪这个问题,例如 GDB or especially valgrind's memcheck(对我来说效果很好):

valgrind --tool memcheck <your binary here>

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

问题已解决。

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 没有(创建分段错误,因为这些变量要索引)