Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何包装一个C_uCDECL API,以便FORTRAN可以调用它(使用u stdcall)?_C++_C_Interop_Fortran_Wrapper - Fatal编程技术网

C++ 如何包装一个C_uCDECL API,以便FORTRAN可以调用它(使用u stdcall)?

C++ 如何包装一个C_uCDECL API,以便FORTRAN可以调用它(使用u stdcall)?,c++,c,interop,fortran,wrapper,C++,C,Interop,Fortran,Wrapper,我正在使用第三方C库,该库使用默认(_cdecl)调用约定,我需要能够从FORTRAN调用第三方库。FORTRAN的默认调用约定是u stdcall,因此我用C编写了一个基本的包装器++ int __stdcall wrapper_sub(char* ver, int* days) { return original_sub(ver,days); }; 具有功能原型 int __stdcall wrapper_sub(char*, int*); 我能够编译没有错误,但是当我检查包装

我正在使用第三方C库,该库使用默认(_cdecl)调用约定,我需要能够从FORTRAN调用第三方库。FORTRAN的默认调用约定是u 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 *))
链接器似乎没有找到原始的_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++认为函数命名为WrAPPIPIONSUB@)YAHOADPAH@Z,FORTRAN希望将其命名为wrapper_sub)

用C编写你的包装,而不是C++,或者添加一个<代码>外部“C”<代码>来修复这个问题。p>

extern "C" int __stdcall wrapper_sub(char* ver, int* days)

有关更多详细信息,请参见此SO问题:

也显示FORTRAN调用。你怎么知道它是“默默地失败”?有什么症状让你知道它失败了?”Dale:我应该解释“失败的沉默”是指,对于C++ LIB项目的VS解决方案是编译和建立没有警告或错误。{#endif和结束括号macro非常感谢Dale的帮助!我现在又回到了我原来的问题(在这个问题中没有提到),我应该开始一个新的问题还是应该在编辑中发布新的错误消息?这样说是不正确的“FORTRAN的默认调用约定为stdcall”。一些FORTRAN编译器将其用作默认值(CVF、MS PowerStation),其他则不使用。几乎所有Windows FORTRAN编译器都有选项和语法供您选择。您使用的是哪种FORTRAN编译器?(请提供名称和版本。)嘿,史蒂夫,听起来很有道理。出于某种原因,我记得我读过这篇文章,尽管我读的内容很可能是FORTRAN编译器特有的……无论如何,我正在使用两个编译器:Powerstation 4.0和Intel(R)Visual Fortran Composer XE 2013 SP1 Update 3 Integration for Microsoft Visual Studio*2012,14.0.0092.11。最后一个问题冗长但准确:)@user3730844如果是另一个问题,请用描述性标题开始一个新问题。SO的目的与其说是帮助您,不如说是帮助接下来的100多个遇到sa的人我的问题。(哦,搜索一下,看看这个问题是否已经被问过了,但你知道。)