与 MSVC 一起使用的 MinGW 的 Fortran 模块导致未解析的符号"__exmod_MOD_value"
Fortran module with MinGW used with MSVC causes unresolved symbol "__exmod_MOD_value"
我想在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 它不能导出模块?
为什么导出模块是一个问题?
相关文章:
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 将无符号char*转换为std::istream*C++
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 瓦尔格林德:数学函数"Conditional jump or move depends on uninitialised value(s)"
- vscode g++链路故障:体系结构x86_64的未定义符号
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 使用gcc从静态链接的文件中查找可选符号
- C++中无符号字符溢出
- 使用无符号字符数组有效存储内存
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- VC++本机单元测试,找不到调试符号
- 为什么我必须在C++中添加一个赋值符号来声明一个数组
- 检查TCHAR数组输入是否为带符号整数C++
- 用符号版本替换对函数的所有调用
- 未解析的外部符号_MsiLocateComponentW@12.
- 如何从通用函数符号计算或指定COFF符号表的"value"?
- 无符号字符给出错误:"expression must have a constant value"