【问题标题】:Mix cdecl and stdcall calling conventions混合 cdecl 和 stdcall 调用约定
【发布时间】:2015-04-29 18:20:17
【问题描述】:

我已经在 Windows VS2012 (.lib) 上构建了一个静态库,使用 stdcall 约定编译。当我说“已经构建”时,我的意思是很遗憾我无法使用我选择的调用约定来重建它。

是否可以从使用 cdecl 约定编译的代码中调用该库中的函数?或者至少做某种包装?

我不确定这是否可能(在浏览了 SO 之后,我实际上几乎确信这是完全不可能的)但有些人 here 含糊地提到可能有一个 kludge。有什么想法吗?

【问题讨论】:

  • 编辑库的 .h 文件并将 __stdcall 放入函数原型中。将您的更改发回给图书馆所有者,这样您只需执行一次。
  • 也许我不清楚:库的函数已经在头文件中有 __stdcall 限定符,并用它编译。我希望从另一个模块(我的)中的 __cdecl 函数调用它们。
  • 那你只有一个想象的问题。
  • 没有。我会更具体地说:我想在我自己的项目中重用一些第三方库(即 Nvidia 的 OpenCL 库的实现 - 在驱动程序中找到)。唉,这些库是使用 stdcall 约定构建的,因此不适用于我的 cdecl 项目。
  • 那么肯定是工具问题——现代编译器编译调用stdcall函数的cdecl函数没有问题,反之亦然。

标签: visual-studio-2012 stdcall cdecl


【解决方案1】:

在静态库的标头中,将导入的函数声明为extern <return_type> __stdcall。在 MSDN 上查看有关调用约定属性的更多信息:https://msdn.microsoft.com/en-us/library/zxk0tw93.aspx

【讨论】:

  • 链接器将无法将导入的函数与其调用相匹配,因为 stdcall 和 cdecl 具有不同的装饰约定。
  • 但是你说这个库是用stdcall编译的。然后,如果它们被声明为 stdcall 链接器应该找到它们。你自己的代码使用什么调用约定无关紧要,除非这个库需要回调,在这种情况下你声明 them stdcall。那么......有什么问题?
猜你喜欢
  • 2012-03-17
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 2013-07-11
  • 2015-04-16
  • 2013-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多