【发布时间】:2014-06-11 16:47:55
【问题描述】:
我正在使用使用默认 (__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 调用。你怎么知道它是“默默地失败”?什么症状让你知道它失败了?
-
@Dale:我应该解释一下,“静默失败”是指c++ lib项目的VS解决方案正在编译和构建,没有警告或错误。
标签: c++ c interop fortran wrapper