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