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

标签 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 的头文件和一个名为 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 编译中以获得一组兼容的运行时库。这生成了没有错误的可执行文件。

关于c - 使用 Fortran 共享库时名称不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52627026/

相关文章:

c - 我的中断没有更新我的主值,我应该如何设置我的中断?

c - 递归相关问题

c - 数据空间溢出

c - X 子结构重定向弄乱了工具/菜单栏

c++ - 在没有 .sln/.project 文件的情况下,C/C++ 中的开源项目是如何执行的?

c++ - #include<iostream> 存在,但我收到错误 : identifier "cout" is undefined. 为什么?

c# - 外部化 appSettings 配置部分(使用 configSource)和 mstest 的冲突

c - 如何使用 fortran 的 c 头文件中定义的结构?

fortran - Fortran 中的多任务处理

c++ - 使用 C++ 代码从 FORTRAN DLL 调用函数