使用Fortran共享库时名称不匹配

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Fortran共享库时名称不匹配相关的知识,希望对你有一定的参考价值。

我设法使用包含由Visual Studio C编译的一些.obj文件(即依赖项)的IFORT成功编译共享库。

当尝试在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

文件Test.f90使用IFORT成功编译如下(结果是一个名为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.obj的源 - Fortran和C.此外,您显示的cl命令尝试生成可执行文件。以下是如何做到正确的:

cl /c /MD /Foctest.obj test.c
ifort /dll test.f90 ctest.obj
ifort example.f90 test.lib

我将/ MD添加到C编译中以获得一组兼容的运行时库。这生成了可执行文件而没有错误

以上是关于使用Fortran共享库时名称不匹配的主要内容,如果未能解决你的问题,请参考以下文章

使用 JNA 使用本机 fortran 库时查找 SIGSEGV 原因的问题

fortran 虚拟参数与实际参数不匹配。铸造可用吗?

Linux:链接共享库时如何使用 .pc 文件?

在为 LINUX 创建共享库时如何避免 STL 的私有/弱副本

使用共享库时 Yarn 工作区的最佳实践

子程序名称 Fortran 名称