2

系统:Windows-7-64 位/Visual-Studio-2010/Intel-Visual-Fortran-11。

我正在创建 32 位可执行文件。

Fortran 例程声明

SUBROUTINE LA01BD(N,M,L,A,B,C,X,F,IA,IPRINT,IND,WK,IER)
  !DEC$ ATTRIBUTES DLLEXPORT::LA01BD
  !DEC$ ATTRIBUTES STDCALL,REFERENCE,ALIAS:"LA01BD"::LA01BD
  use, intrinsic :: ISO_C_BINDING

C++ 函数签名声明

extern "C" {void __stdcall LA01BD(int *N, int *M, int *L, double *A, double *B, double *C, double *X, double *F, int *IA, int *IPRINT, int *IND, double *WK, int *IER); }

我使用 Visual Studio 2010 和 Intel Visual Fortran 编译器 11 从 fortran 代码创建了 dll。我检查了依赖 walker 中导出的符号,函数为“LA01BD”。

在我的 C++ 项目中使用相同的 dll(链接期间的 .lib 文件)时,出现以下链接器错误。

lpwrap.obj : error LNK2001: unresolved external symbol _LA01BD@52

我无法解决这个问题。后缀“@52”有什么作用?如何解决链接问题?

谢谢。

4

3 回答 3

3

C++ 编译器将名称修饰应用于标识符。__stdcall 装饰是一个前导的 _underscore 和一个尾随的 @n,其中 n 是激活帧的大小。

Fortran 代码中的 ALIAS 指令导致了此问题,您强制将其导出为“LA01BD”而不是“_LA01BD@52”。您应该首先尝试将其删除,以便应用正常的名称装饰。如果这不是一个选项,那么您需要使用 lib.exe /def 从正确制作的 .def 文件创建导入库,或者回退到使用 GetProcAddress() 进行后期绑定。

于 2013-10-21T16:59:23.213 回答
2

如果必须使用 STDCALL 调用约定,则将 DECORATE 属性添加到 Fortran 端以指示编译器装饰指定的别名。

SUBROUTINE LA01BD(N,M,L,A,B,C,X,F,IA,IPRINT,IND,WK,IER)
!DEC$ ATTRIBUTES DLLEXPORT::LA01BD
!DEC$ ATTRIBUTES STDCALL,REFERENCE,ALIAS:"LA01BD"::LA01BD
!DEC$ ATTRIBUTES DECORATE :: LA01BD
于 2013-10-21T19:39:22.033 回答
0

它是由名称损坏引起的,请参阅以获取详细信息。我猜你错过了 C++ 项目中的外部“c”。

于 2013-10-21T16:20:16.387 回答