c - 使用 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.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 编译中以获得一组兼容的运行时库。这生成了没有错误的可执行文件。
推荐阅读
- performance - 使用在 App 开头加载的 JSON 配置文件还是在 Flutter 中使用具有静态/最终变量的类更好?
- swift - 向 MLMultiArray 添加元素
- tensorflow - CuDNN 与 tensorflow 1.11.0+Cuda9.0 不兼容
- javascript - 为什么我的程序在我的页面刷新之前没有执行?
- c# - 在 asp.net webforms 中回发后未调用我的函数
- elasticsearch - Elasticsearch 仅返回与 id 数组匹配的结果
- amazon-web-services - 将值从 CloudFormation 传递到 Swagger 文件
- javascript - 同步绘图
- spring-boot - 不同数据中心上的 Spring 和计划任务
- mathematical-optimization - SCIP 代码如何处理 SAT 问题?