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

时间:2017-07-26 14:19:24

标签: c++ visual-c++ fortran gfortran

我想在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编译main.cpp:

main.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

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

1 个答案:

答案 0 :(得分:0)

至少我找到了避免此错误的方法。 我查看了文件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

工作正常,main.exe文件返回正确的值。 由于这不是正确的方法,其余的问题是:

我如何告诉gfortran它不能导出模块?

为什么导出模块有问题?