我想在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
我可以做些什么来解决这个问题吗?
答案 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它不能导出模块?
为什么导出模块有问题?