如何包装C __cdecl API,以便FORTRAN可以调用它(使用__stdcall)



我正在使用使用默认(__cdecl)调用约定的第三方C库,我需要能够从FORTRAN调用第三方库。FORTRAN的默认调用约定是__stdcall,所以我用c++写了一个基本的包装器

int __stdcall wrapper_sub(char* ver, int* days)
{
   return original_sub(ver,days);
};

带函数原型

int   __stdcall wrapper_sub(char*, int*);

我能够编译没有错误,但当我检查包装器库的符号表时,我得到

?wrapper_sub@@YAHOADPAH@Z(int __cdecl original_sub(char *, int *))

链接器似乎没有找到original_sub,进程正在无声地失败。我已经在项目中包含了所有必要的引用和目录,以便包装器解决方案能够正确地解析第三方API。

FORTRAN调用如下所示

PROGRAM MAIN
IMPLICIT REAL*8 (A-H, O-Z)
CHARACTER*(4)        VER
VER = '1.0'
ISTAT = wrapper_sub(VER,IDAYS)
STOP
END
在包含对包装器库的外部引用之后,我得到以下错误
error LNK2001: unresolved external symbol _WRAPPER_SUB@12

我错过了什么吗?还是有另一种(更不容易出错?)的方式来包装C API,以便我可以从FORTRAN调用它?

链接器不能将你的FORTRAN代码链接到库,因为函数名被打乱了(c++认为函数名为?wrapper_sub@@YAHOADPAH@Z, FORTRAN期望它被命名为wrapper_sub)

用C编写包装器,而不是c++,或者添加extern "C"来解决这个问题。

extern "C" int __stdcall wrapper_sub(char* ver, int* days)
在c++源码中,extern "C"的作用是什么?

相关内容

  • 没有找到相关文章

最新更新