系统: Windows-7-64-bit/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_BINDINGC++函数签名声明
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 2010和Intel Visual编译器11从fortran代码创建了dll。我在dependency中检查了导出的symobol,函数是"LA01BD“。
在我的.lib项目中使用相同的dll (链接期间的.lib文件)时,我会得到以下链接器错误。
lpwrap.obj : error LNK2001: unresolved external symbol _LA01BD@52我无法解决这个问题。"@52“后缀是什么?如何解决链接问题?
谢谢。
发布于 2013-10-21 16:59:23
C++编译器将名称修饰应用于标识符。__stdcall装饰是一个前导_underscore和一个尾随@n,其中n是激活帧的大小。
Fortran代码中的别名指令导致了这个问题,您强迫它作为"LA01BD“而不是"_LA01BD@52”导出。您应该首先尝试删除它,以便应用普通的名称装饰。如果这不是一个选项,那么您需要使用lib.exe /def从精心编制的.def文件创建一个导入库,或者回到与GetProcAddress()的后期绑定。
发布于 2013-10-21 19:39:22
如果必须使用STDCALL调用约定,则向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-21 16:20:16
这是由名称损坏引起的,详情请参考这。我猜你错过了你的C++项目中的"c“。
https://stackoverflow.com/questions/19498962
复制相似问题