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

时间:2018-10-03 12:27:18

标签: c visual-studio fortran intel-fortran

我设法使用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

文件Test.f90已通过IFORT成功编译,如下所示(结果是一个名为Test_dll.dll的共享库及其名为Test_dll.lib的头文件和名为{{1}的Fortran模块文件}):

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。知道发生了什么吗?

1 个答案:

答案 0 :(得分:1)

请注意,您有两个可编译为test.obj的源-Fortran和C。此外,显示的cl命令尝试生成可执行文件。正确操作的方法如下:

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

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