Есть ли STDCALL в Linux?

Я пытаюсь перенести приложение Windows в Linux. Это приложение отмечает некоторые функции с атрибутом __stdcall. Тем не менее, мне сказал друг, что stdcall используется только для окон и не имеет смысла в linux (но они существуют в Windows GCC). Я попытался найти Google об этом и получил некоторые результаты, заявив, что в Linux есть stdacll.

Итак...??

Кроме того, для GCC я видел 2 реализации для этого: __attribute__((__stdcall__)) и __attribute__((stdcall)) (без подчеркивания возле stdcall). Какой из них предпочтительнее (если вообще применяется к Linux)?

Спасибо!

Ответы

Ответ 1

Самое простое решение - просто определить __stdcall ни к чему условно в Linux.

Ответ 2

Здесь ссылка на описание __stdcall на MSDN: http://msdn.microsoft.com/en-us/library/zxk0tw93(VS.80).aspx

Он используется только для вызова функций WinAPI. Чтобы перенести такое приложение Windows в Linux, вам нужно гораздо больше, чем просто определить __stdcall для ничего:

#ifndef WIN32 // or something like that...
#define __stdcall
#endif

Вам также нужно будет вызывать специфичные для Linux функции API вместо Win32 API. В зависимости от конкретной части Win32 API и размера приложения (количество кода) он может быть где угодно между умеренно сложными и сложными.

Какие конкретные функции отмечены приложением как __stdcall?

Действительно, порт Windows GCC должен иметь __stdcall, поскольку он должен иметь возможность генерировать соответствующий код для платформы Win32. Но поскольку в Linux существует только одно стандартное соглашение о вызове и оно совпадает с выводом компилятора по умолчанию, это утверждение не требуется.

Причина, по которой ваше приложение не компилируется в Linux, почти наверняка связано с тем, что он ссылается на функции Win32 API, которые не определены в Linux - вам нужно найти подходящие аналоги Linux. API Win32 API и Linux API GLibc очень разные и не могут быть легко заменены.

Вероятно, самым простым способом переноса вашего приложения в Linux было бы использовать Wine, то есть модифицировать код Windows таким образом, чтобы он работал плавно под Wine в Linux. Таким образом, даже самые сложные приложения, такие как современные компьютерные игры, были запущены под Linux.

Конечно, если вы действительно хотите, чтобы он запускался изначально под Linux, то портирование - единственный способ пойти.