Соглашение о вызовах с общей библиотекой для Android

Я создал несколько файлов плагинов на C++ для своего приложения Unity3d. До сих пор приложение было простым прототипом, поэтому я тестировал его только на своем рабочем столе с библиотеками, скомпилированными как DLL для Windows. Сегодня я перекомпилировал эти файлы как .so(Shared Object) для Android (как для рук, так и для x86) и получил предупреждающее сообщение.

предупреждение: соглашение о вызовах '__stdcall' игнорируется для этой цели [-Wignored-attributes]

<сильный>1. Это означает, что все функции скомпилированы как __cdecl?

<сильный>2. Могу ли я указать соглашение о вызовах в библиотеке .so?

Я заменил __stdcall на __cdecl, но также появляется предупреждающее сообщение.


person Jenix    schedule 22.09.2015    source источник


Ответы (1)


Оба они являются нестандартным историческим багажом Microsoft для IA32 (на самом деле они являются непереносимыми, совместимыми со стандартами расширениями для C и C++, реализованными компиляторами Microsoft и GCC для совместимости), для которых мир *NIX имел - и никогда была потребность.

Почти во всех системах ARM, с которыми вы когда-либо сталкивались (и во всех системах Android), соглашение о вызовах определяется Стандарт вызова процедур ARM. Неудивительно, что для ARM нет аналогов, так как в них нет необходимости.

Лучше всего использовать пустые макросы, чтобы они исчезли.

#define __cdecl
#define __stdcall
person marko    schedule 22.09.2015
comment
Вау, большое спасибо за очень информативный ответ! Я этого не знал. Но, честно говоря, теперь я еще больше запутался. Я могу удалить все соглашения о вызовах из исходных файлов C++, это не имеет большого значения. Но проблема в исходниках С#. Я использую атрибут [DllImport] для импорта моей неуправляемой библиотеки в C#. Соглашение о вызовах по умолчанию для [DllImport] — StdCall. Вот почему я задал первый вопрос, чтобы я мог сопоставить их. Как вы думаете, нормально ли не устанавливать какие-либо соглашения о вызовах в C#? Я приму ваш ответ первым - person Jenix; 23.09.2015
comment
Они по-прежнему понадобятся вам в Windows (думаю, для IA64 они не действуют). Вам нужно будет определить эти макросы при компиляции для чего угодно, кроме IA32/x86 в Windows. - person marko; 23.09.2015
comment
хорошо, я оставлю их, используя макросы, как вы сказали. Но я хотел знать, как работать с С# для Android. По умолчанию [DllImport(myDLL)] означает [DllImport(myDLL, CallingConvention=CallingConvention.StdCall)]. Я думал, что это может привести к ошибкам в определенных ситуациях. В любом случае спасибо! - person Jenix; 23.09.2015
comment
Я сильно подозреваю, что привязкам на Android все равно: используется только одно соглашение о вызовах. Если по какой-то причине он жалуется на их отсутствие, сделайте так, чтобы ваши макросы применялись только при сборке библиотеки компилятором не от Microsoft. - person marko; 23.09.2015