使用 Fortran 共享库时名称不匹配
Name mismatch when using Fortran shared library
我设法使用 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
成功用微软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
文件 Test.f90
使用 IFORT 成功编译如下(结果是一个名为 Test_dll.dll
的共享库及其名为 Test_dll.lib
的头文件,以及一个名为 test.mod
):
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.obj 的源代码 - Fortran 和 C。此外,您显示的 cl 命令尝试生成可执行文件。以下是正确的做法:
cl /c /MD /Foctest.obj test.c
ifort /dll test.f90 ctest.obj
ifort example.f90 test.lib
我将 /MD 添加到 C 编译以获得一组兼容的 运行-time 库。这生成了没有错误的可执行文件。
我设法使用 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
成功用微软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
文件 Test.f90
使用 IFORT 成功编译如下(结果是一个名为 Test_dll.dll
的共享库及其名为 Test_dll.lib
的头文件,以及一个名为 test.mod
):
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.obj 的源代码 - Fortran 和 C。此外,您显示的 cl 命令尝试生成可执行文件。以下是正确的做法:
cl /c /MD /Foctest.obj test.c
ifort /dll test.f90 ctest.obj
ifort example.f90 test.lib
我将 /MD 添加到 C 编译以获得一组兼容的 运行-time 库。这生成了没有错误的可执行文件。