1

我用 C 写了一段代码。

您可以在此处找到源代码。

它利用了库 blas、lapack 和 openmp。

我按照这些说明编译了 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 的区别,你知道对此有什么解释吗?

4

2 回答 2

1

问题解决了。

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

外部无效 dgemm_(...)

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

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

于 2016-09-24T00:59:25.610 回答
0

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

不知道你的代码很难说,但你可以自己使用一些工具来追踪这个问题,例如GDB或特别是valgrind 的 memcheck(对我来说非常出色):

valgrind --tool memcheck <your binary here>

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

于 2016-09-23T18:18:48.153 回答