【发布时间】:2018-10-03 12:27:18
【问题描述】:
我成功地使用 IFORT 编译了一个共享库,其中包含一些由 Visual Studio C 编译的 .obj 文件(即依赖项)。
当尝试在 Fortran 程序中使用此共享库时,它会显示 Example.obj : error LNK2019: unresolved external symbol TEST_mp_EXECUTE referenced in function MAIN__ 失败。
当我使用工具dumpbin.exe 时,我可以看到函数execute 在共享库中。知道为什么名称不匹配会导致 Fortran 程序的编译失败吗?
文件Test.c的内容:
__declspec(dllexport) int execute(void);
int execute(void)
{
return 2 + 3;
}
文件Test.c用Microsoft Visual Studio C成功编译如下(结果是一个名为Test.obj的目标文件):
cl.exe Test.c /FoTest.obj
文件Test.f90的内容:
MODULE Test
USE, INTRINSIC :: iso_c_binding, ONLY: c_int
IMPLICIT NONE
INTERFACE
INTEGER(c_int) FUNCTION execute() BIND(C, name = "execute")
USE, INTRINSIC :: iso_c_binding, ONLY: c_int
END FUNCTION
END INTERFACE
END MODULE
使用 IFORT 成功编译的文件 Test.f90 如下(结果是一个名为 Test_dll.dll 的共享库及其名为 Test_dll.lib 的头文件,以及一个名为 test.mod 的 Fortran 模块文件):
ifort.exe Test.obj /Qm64 /LD /FeTest_dll.dll
文件Example.f90的内容:
PROGRAM Example
USE test
state = execute()
END PROGRAM
现在,当尝试将文件 Example.f90 编译为 ifort.exe Example.f90 Test_dll.lib 时,它会失败说 Example.obj : error LNK2019: unresolved external symbol TEST_mp_EXECUTE referenced in function MAIN__。知道发生了什么吗?
【问题讨论】:
-
是的,我们需要更多详细信息,但请注意
test_execute不是TEST_mp_EXECUTE。后者应该是模块test中的过程execute,而不是称为test_execute的过程。 -
@francescalus:你是对的;我已经编辑了问题以反映您的评论,但也因为这是现实中发生的事情(不知何故,我在原始问题中错误地复制并粘贴了它)。
-
但我们仍然需要minimal reproducible example。仅仅改变函数的名字是不够的。 MCVE 包括用于编译的命令和我们必须使用的任何其他必要配置。
-
@VladimirF:我添加了包含 MCVE 的问题。
标签: c visual-studio fortran intel-fortran