我使用了一些从 C++ 调用 Fortran 例程的科学计算代码,它突然开始在 gcc 6 下发出警告。这是准系统问题:
mult
考虑定义在 中的 Fortran 子例程mult.f90
:
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++-6(我的版本是 6.2.0)替换为 g++-5(版本 5.4.1)
-flto
不带标志编译- 使用 double(而不是 std::complex)和 real*8(而不是 complex*16)
我应该担心,还是我可以忽略这个警告?在前一种情况下,我该如何解决这个问题?