我用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>
这将报告代码中与内存相关的错误和未定义行为的位置。