首页 > 解决方案 > 使用 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;
}

使用 Microsoft Visual Studio C 成功编译的文件Test.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,以及一个名为 的 Fortran 模块文件test.mod):

ifort.exe Test.obj /Qm64 /LD /FeTest_dll.dll

文件内容Example.f90

PROGRAM Example

    USE test

    state = execute()

END PROGRAM

现在,当尝试编译文件时Example.f90ifort.exe Example.f90 Test_dll.lib它会说Example.obj : error LNK2019: unresolved external symbol TEST_mp_EXECUTE referenced in function MAIN__. 知道发生了什么吗?

标签: cvisual-studiofortranintel-fortran

解决方案


请注意,您有两个编译为 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 编译中以获得一组兼容的运行时库。这生成了没有错误的可执行文件。


推荐阅读