GCC компилирует dll с помощью __stdcall
-
01-07-2019 - |
Вопрос
Когда мы компилируем dll с помощью __stdcall внутри Visual Studio 2008, имена скомпилированных функций внутри dll:
ИмяФункции
Хотя, когда мы компилируем одну и ту же dll с использованием GCC, используя wx-dev-cpp, GCC добавляет количество параметров, которые имеет функция, поэтому имя функции, использующей Dependency Walker, выглядит так.
ИмяФункции@ЧислоПараметров или == ИмяФункции@8
Как сообщить компилятору GCC удалить @nn из экспортированных символов в dll?
Решение
__stdcall украшает имя функции, добавляя подчеркивание в начале и количество байтов параметров в конце (разделенные символом @).
Итак, функция:
void __stdcall Foo(int a, int b);
...станет _Foo@8.
Если вы укажете имя функции (без оформления) в разделе EXPORTS вашего файла .DEF, оно будет экспортировано без оформления.
Возможно, в этом и есть разница?
Другие советы
Просто используйте -Wl,--kill-at
в командной строке gcc, которая пройдет --kill-at
к линкеру.
Использованная литература:
Вы также можете использовать -Wl,--add-stdcall-alias
к вашим параметрам компоновщика в GCC.Это гарантирует, что оба имени функции (декорированные и недекорированные) присутствуют и могут использоваться в качестве псевдонимов.