我正在使用使用默认(__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)


有关更多详细信息,请参见此SO问题:In C++ source, what is the effect of extern "C"?

10-06 13:06
查看更多