現在、Windows で Intel ツールを使用してコンパイルされた大規模な C/Fortran 混合コード ベースがあります。Linux 上の GNU ツールに移植するよう依頼されました。多かれ少なかれランダムに、バージョン 4.8 を選択しました。
C 関数が Fortran から呼び出される場合、相互運用性は次のようになります。
// C code:
void PRINTSTR(char *str, size_t len) {
for(int ii = 0; ii < len; ii++) {
putchar(str[ii]);
}
putchar('\n');
}
!Fortran code:
program test
implicit none
call printstr("Hello, world.")
end
インテル Fortran コンパイラーは常に大文字のシンボルを生成するため、これは正常に機能します。しかし、GNU Fortran コンパイラは常に小文字のシンボルを生成するため、リンカ エラーが発生します。
-fcase-upper
GNU Fortran コンパイラには、大文字のシンボルを生成するオプションが呼び出されていましたが、これは構成可能すぎて誰にとっても適切ではないようで、削除されました (正確な時期はわかりません)。
この機能を使用してISO_C_BINDING
、コンパイラに大文字と小文字を区別する名前を強制的に生成させることができます。
program test
interface
subroutine printstr(str) bind(C, name='PRINTSTR')
character :: str(*)
end subroutine
end interface
call printstr("Hello, world.")
end
これによりリンカー エラーは解決されますが、文字列パラメーターの処理方法が変わります。長さパラメーターは提供されなくなりました。したがって、このメソッドを使用するには、現在この方法で動作するすべての関数のインターフェイス定義を追加するだけでなく、そのような関数を呼び出すたびに文字列がどのように処理されるかを変更する必要があります。 null で終了します。
そのような関数をすべて小文字にすることもできますが、もちろん、インテル コンパイラーは引き続き大文字のシンボルを生成するため、既存のビルドが壊れてしまいます。
そのような関数は約 2,000 あるので、実行不可能な量の作業に思えます。そこで、私の質問は次のとおりです。関数呼び出しのセマンティクスを変更せず、インテル® コンパイラーを使用して既存のビルドを壊さずに、リンク エラーを解決するにはどうすればよいですか?