我使用一些科学计算代码从C调用Fortran例程,它突然开始在gcc 6下发出警告 . 这是准系统问题:
考虑在 mult.f90
中定义的Fortran子例程 mult
:
subroutine mult(c)
complex*16 c
c = c * c
return
end
我从C文件中调用它 test.cpp
:
#include <complex>
#include <iostream>
extern "C" void mult_(std::complex<double> *);
int main() {
std::complex<double> z (1,0);
mult_(&z);
std::cout << z << "\n";
return 0;
}
当我使用g -6编译文件时,我收到以下警告:
$ g++-6 -O3 -W -Wall test.cpp mult.f90 -flto -o test2
test.cpp:4:17: warning: type of ‘mult_’ does not match original declaration [-Wlto-type-mismatch]
extern "C" void mult_(std::complex<double> *);
^
mult.f90:1:1: note: ‘mult’ was previously declared here
subroutine mult(c)
^
mult.f90:1:1: note: code may be misoptimized unless -fno-strict-aliasing is used
如果我执行以下任何操作,警告就会消失:
-
用g -5(版本5.4.1)替换g -6(我的版本是6.2.0)
-
编译时没有
-flto
标志 -
使用double(而不是std :: complex)和real * 8(而不是复数* 16)
我应该担心,还是这是一个我可以忽略的警告?在前一种情况下,我该如何解决这个问题?
1 回答
我能找到最接近的相关问题是https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78562#c6
似乎编译器警告不相关 .
我在C中编译了以下代码,并将生成的汇编程序与fortran代码进行了比较
看结果:实现略有不同(fortran似乎不使用单个GP寄存器,而C使用RBX)但调用约定等完全相同,所以你不必担心