首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Fortran和C++:Visual中的链接错误

Fortran和C++:Visual中的链接错误
EN

Stack Overflow用户
提问于 2013-10-21 15:42:37
回答 3查看 1.8K关注 0票数 2

系统: Windows-7-64-bit/Visual-Studio-2010/Intel-Visual-Fortran-11.

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

Fortran例行声明

代码语言:javascript
复制
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++函数签名声明

代码语言:javascript
复制
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文件)时,我会得到以下链接器错误。

代码语言:javascript
复制
lpwrap.obj : error LNK2001: unresolved external symbol _LA01BD@52

我无法解决这个问题。"@52“后缀是什么?如何解决链接问题?

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-21 16:59:23

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

Fortran代码中的别名指令导致了这个问题,您强迫它作为"LA01BD“而不是"_LA01BD@52”导出。您应该首先尝试删除它,以便应用普通的名称装饰。如果这不是一个选项,那么您需要使用lib.exe /def从精心编制的.def文件创建一个导入库,或者回到与GetProcAddress()的后期绑定。

票数 3
EN

Stack Overflow用户

发布于 2013-10-21 19:39:22

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

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2013-10-21 16:20:16

这是由名称损坏引起的,详情请参考。我猜你错过了你的C++项目中的"c“。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19498962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档