Я создаю C программу, которая явно динамически загружает DLL как часть системы плагинов. Я использую G CC с MinGW на Windows 7.
Какое соглашение о вызовах должно использовать экспортируемые функции в DLL для того, чтобы быть максимально устойчивыми: успешно работать на разных Windows машины, выдерживающие разные версии компиляторов и т. д. c.
Я знаю, что основной исполняемый файл и библиотеки DLL должны использовать только одно и то же соглашение о вызовах. Как это обычно управляется?
В настоящее время я только стремлюсь поддержать Windows (хотя ответы, относящиеся также к той же теме на Linux, также будут приветствоваться).
РЕДАКТИРОВАТЬ:
Пожалуйста, позвольте мне прояснить вопрос, как обсуждалось в разделе комментариев с @SS Anne.
Меня меньше беспокоит конкретное соглашение о вызовах. Меня больше беспокоит вопрос о том, что является стандартным способом обеспечения совместимости между двоичным файлом, созданным на компьютере X, и DLL (подключаемым модулем), созданным кем-то другим на компьютере Y, который может иметь другую ОС и т. Д. c.
Один из подходов, который я могу придумать, заключается в том, что в файле заголовка, распространяемом среди разработчиков плагинов, мы определяем макрос, который определяет ожидаемое соглашение о вызовах функций, предоставляемых плагином для основной программы. Эти функции будут определены разработчиком плагина с помощью этого макроса.
Например, заголовок api.h
, предоставляемый разработчикам плагина, определяет #define CALL __cdecl
. И после выполнения #include "api.h"
экспортируемые функции в DLL плагина объявляются так: void CALL func(void);
.
Используется ли это решение на практике? Есть ли разные подходы?