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 の代わりに) を使用します。
心配する必要がありますか、それとも無視できる警告ですか? 前者の場合、どうすれば問題を解決できますか?