Linux中有STDCALL吗?

Bre*_*int 18 c++ linux porting stdcall

我正在尝试将Windows应用程序移植到Linux.这个appplication用__stdcall属性标记了一些函数.但是,朋友告诉我,stdcall仅用于Windows并且在linux中没有任何意义(但是Windows GCC中存在DOES).我试图在谷歌搜索这个,并得到一些结果表明在Linux中存在stdacll.

所以......?

此外,对于GCC,我看到了2个实现:__attribute__((__stdcall__))__attribute__((stdcall))(没有stdcall附近的下划线).哪一个是首选(如果适用于Linux)?

谢谢!

dic*_*oce 11

最简单的解决方案是在Linux上有条件地将__stdcall定义为无条件.

  • 这就是为什么我建议编写一个扩展为""的条件(仅限linux)宏. (2认同)

And*_*nin 10

这是MSDN上__stdcall描述的链接:http://msdn.microsoft.com/en-us/library/zxk0tw93( VS.80) .aspx

它仅用于调用WinAPI函数.要将这样的Windows应用程序移植到Linux,您需要的不仅仅是将__stdcall定义为空:

#ifndef WIN32 // or something like that...
#define __stdcall
#endif
Run Code Online (Sandbox Code Playgroud)

您还需要调用特定于Linux的API函数而不是Win32 API函数.根据Win32 API的特定部分和应用程序的大小(代码量),它可以介于中等难度和令人生畏之间.

应用程序将哪些特定功能标记为__stdcall?

实际上,GCC的Windows端口必须具有__stdcall,因为它应该能够为Win32平台生成符合规范的代码.但是因为在Linux下只有一个标准的调用约定,它与默认的编译器输出一致,所以不需要这个语句.

您的应用程序未在Linux下编译的原因几乎可以肯定是因为它引用了未在Linux下定义的Win32 API函数 - 您需要找到适当的Linux对应项.Win32 API和Linux GLibc API是非常不同的,不能轻易替换.

将应用程序移植到Linux的最简单方法可能是使用Wine,即以这种方式修改Windows代码,使其在Linux下的Wine下顺利运行.即使是最复杂的应用程序,如现代计算机游戏,也可以在Linux下运行.

当然,如果你真的希望它在Linux下本地运行,那么移植是唯一的出路.