与 MSVC 一起使用的 MinGW 的 Fortran 模块导致未解析的符号"__exmod_MOD_value"

Fortran module with MinGW used with MSVC causes unresolved symbol "__exmod_MOD_value"

本文关键字:符号 value exmod MOD 一起 MSVC MinGW 模块 Fortran      更新时间:2023-10-16

我想在Windows上使用Fortran库,其中包含许多模块。因此,我需要使用 MinGW 编译这个库。要使用 MSVC 编译器,我需要使用外部链接编译库,如以下两个链接中所述:

https://groups.google.com/forum/#!topic/comp.lang.fortran/s8CiQnNmO14 https://blog.kitware.com/fortran-for-cc-developers-made-easier-with-cmake/

只要我不使用模块,这似乎就可以工作。

下面是一个最小示例:

Fortran 代码:

!-------------------------------------------------------------------------!
!                                                                         !
!     MODULE EXMOD                                                        !
!                                                                         !
!-------------------------------------------------------------------------!
MODULE EXMOD
INTEGER                                        :: VALUE
CONTAINS
!-------------------------------------------------------------------------!
!                                                                         !
!     INITOPTMOD                                                          !
!                                                                         !
!-------------------------------------------------------------------------!
SUBROUTINE INITOPTMOD(VALUE_IN)
IMPLICIT NONE
INTEGER, INTENT(IN)                             :: VALUE_IN
VALUE = VALUE_IN
WRITE(*,*) 'The Value is: ', VALUE
RETURN
END SUBROUTINE INITOPTMOD
END MODULE EXMOD
!-------------------------------------------------------------------------!
!-------------------------------------------------------------------------!
!                                                                         !
!     EXTERN CALLER                                                       !
!                                                                         !
!-------------------------------------------------------------------------!
SUBROUTINE FORTCALL( VALUE_ )
USE EXMOD
INTEGER, INTENT(IN)                      :: VALUE_
CALL INITOPTMOD(VALUE_)
END SUBROUTINE FORTCALL
!-------------------------------------------------------------------------!

我用:

gfortran forfunc.f90 -c
gfortran -o libfortfunc.dll forfunc.o -shared -Wl,--output-def,libfortfunc.def
lib /MACHINE:x64 /def:libfortfunc.def /out:libfortfunc.lib

编译库后,我尝试使用 MSVC 编译主.cpp:

主.cpp:

extern "C" {
void fortcall_( int *value );
}
int main()
{
int value = 12;
fortcall_( &value );
return 0;
} 

我尝试用以下命令编译它:

cl main.cpp libfortfunc.exp libfortfunc.lib

如果没有模块,这工作正常,但由于 fortran 代码包含一个,因此会发生以下错误:

/out:main.exe
main.obj
libfortfunc.exp
libfortfunc.lib
libfortfunc.exp : error LNK2001: Nicht aufgelöstes externes Symbol "__exmod_MOD_value".
main.exe : fatal error LNK1120: 1 nicht aufgelöste Externe

我可以做些什么来解决这个问题吗?

至少我找到了避免此错误的方法。 我看了一下文件libfortfunc.def:

EXPORTS
__exmod_MOD_initoptmod @1
__exmod_MOD_value @2 DATA
fortcall_ @3

由于我不想使用C++代码中的模块,因此我只是删除了模块中的所有导出。之后,我运行命令:

lib /MACHINE:x64 /def:libfortfunc.def /out:libfortfunc.lib
cl main.cpp libfortfunc.exp libfortfunc.lib

这工作正常,主.exe文件返回正确的值。 由于这感觉不是正确的方法,因此剩下的问题是:

我怎么能告诉 gfortran 它不能导出模块?

为什么导出模块是一个问题?