Я пытаюсь портировать Приложение Windows на Linux. Это приложение отмечает некоторые функции с __stdcall
атрибут. Однако мне сказал друг, что stdcall используется только на окнах и не имеет никакого значения в Linux (но ДЕЙСТВИТЕЛЬНО существует в Windows GCC). Я попытался искать Google об этом и добрался, некоторые результаты указывают, что СУЩЕСТВУЕТ stdacll в Linux.
Так...??
Кроме того, для GCC я видел 2 реализации для этого: __attribute__((__stdcall__))
и __attribute__((stdcall))
(без символов нижнего подчеркивания рядом stdcall). Какой предпочтен (Если относился к Linux вообще)?
Спасибо!
Простейшее решение - просто определить __stdcall как пустое условное значение в Linux.
Вот ссылка на описание __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?
Действительно, порт GCC для Windows должен иметь __stdcall, потому что он должен иметь возможность генерировать соответствующий код для платформы Win32. Но поскольку в Linux существует только одно стандартное соглашение о вызовах, которое совпадает с выводом компилятора по умолчанию, этот оператор не нужен.
Причина, по которой ваше приложение не компилируется под Linux, почти наверняка связана с тем фактом, что оно ссылается на функции Win32 API, которые не определены под Linux - вам нужно найти подходящие аналоги для Linux. Win32 API и Linux GLibc API очень сильно различаются и не могут быть легко заменены.
Вероятно, самый простой способ перенести ваше приложение на Linux - это использовать Wine, то есть изменить код Windows таким образом, чтобы он без проблем работал под Wine в Linux. Таким образом, даже самые сложные приложения, такие как современные компьютерные игры, были созданы для работы под Linux.
Конечно, если вы действительно хотите, чтобы он работал под Linux, перенос - единственный выход.