【问题标题】:How to wrap a C __cdecl API so that FORTRAN can call it (using __stdcall)?如何包装 C __cdecl API 以便 FORTRAN 可以调用它(使用 __stdcall)?
【发布时间】: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


【解决方案1】:

链接器无法将您的 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"?

【讨论】:

  • 知道了,我不小心注释掉了 #ifdef __cplusplus extern "C" { #endif 和右括号宏
  • 非常感谢戴尔的帮助!我现在回到我原来的问题(这个问题中没有提到),我应该开始一个新问题还是应该在编辑中发布新的错误消息?
  • 说“FORTRAN 的默认调用约定是 stdcall”是不正确的。一些 Fortran 编译器将其用作默认值(CVF、MS PowerStation),而其他编译器则不使用。几乎所有的 Windows Fortran 编译器都有选项和语法供您选择。您使用的是哪个 Fortran 编译器? (请提供名称和版本。)
  • 嘿史蒂夫,听起来很有道理。出于某种原因,我记得读过那篇文章,尽管我读到的更有可能是 FORTRAN 编译器所特有的……无论如何,我正在使用两个编译器:Powerstation 4.0 和 Intel(R) Visual Fortran Composer XE 2013 SP1 Microsoft Visual Studio* 2012、14.0.0092.11 的更新 3 集成。最后一个是冗长但准确的:)
  • @user3730844 如果是其他问题,请使用描述性标题开始一个新问题。 SO 的目的与其说是帮助你,不如说是帮助接下来遇到同样问题的 100 人左右。 (哦,搜索一下,看看这个问题是否已经被问过了,但你知道的。)
猜你喜欢
  • 1970-01-01
  • 2010-11-07
  • 1970-01-01
  • 2021-10-01
  • 2013-02-09
  • 1970-01-01
  • 2023-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多