22

Windows アプリを Linux に移植しようとしています。このアプリケーションは、一部の関数を属性でマークし__stdcallます。stdcallただし、 Windows でのみ使用され、Linux では意味がない (ただし、Windows GCC には存在する)友人から言われました。

Google で検索 - 一部の結果stdcallでは、Linux に IS があると述べています。

stdcallLinuxにはありますか?

さらに、GCC は次のことを示します: __attribute__((__stdcall__))and __attribute__((stdcall))(stdcall の近くにアンダースコアなし)。

どちらが優先されますか (Linux に適用される場合)?

4

3 に答える 3

15

最も簡単な解決策は、Linux で条件付きで __stdcall を何も定義しないことです。

于 2010-06-16T14:36:41.800 に答える
11

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

また、Win32 API 関数の代わりに Linux 固有の API 関数を呼び出す必要があります。Win32 API の特定の部分とアプリケーションのサイズ (コードの量) に応じて、中程度の難しさと困難の間のどこかになる可能性があります。

アプリによって __stdcall としてマークされている特定の関数はどれですか?

実際、GCC の Windows ポートには __stdcall が必要です。これは、Win32 プラットフォームに適合するコードを生成できるはずだからです。しかし、Linux では標準の呼び出し規則が 1 つしかなく、デフォルトのコンパイラ出力と一致するため、このステートメントは必要ありません。

アプリケーションが Linux でコンパイルされない理由は、ほとんどの場合、Linux で定義されていない Win32 API 関数を参照しているという事実によるものです。適切な Linux の対応物を見つける必要があります。Win32 API と Linux GLibc API は大きく異なり、簡単に置き換えることはできません。

おそらく、アプリを Linux に移植する最も簡単な方法は、Wine を使用することです。つまり、Linux の Wine でスムーズに動作するように Windows コードを変更します。これは、最新のコンピューター ゲームなどの最も複雑なアプリケーションでさえ、Linux で実行するために作成された方法です。

もちろん、Linux でネイティブに実行したい場合は、移植するしか方法はありません。

于 2010-06-16T15:31:23.057 に答える