Как изменить оформление экспортированного имени для __stdcall в VC++?
Вот как я объявил мою функцию экспорта в данный момент:
extern "C" __declspec(dllexport)
Iexport_class* __stdcall GetExported_Class();
Когда VS2008 скомпилировал источник для этого, созданная dll содержит это в своей таблице экспорта:
_GetExported_Class@0
Для совместимости с другими компиляторами мне нужно, чтобы вышеприведенное оформление выглядело так:
GetExported_Class
Изменение соглашения о вызовах на __cdecl украсит его так, как я хочу, но соглашение будет неправильным, поэтому я не могу его использовать. Мне нужно, чтобы он был оформлен так, как выглядит __cdecl, но вместо этого использует __stdcall.
Есть ли способ сделать это без использования файла.def? Есть ли переключатель или опция, которую я могу передать линкеру link.exe, который может заставить его экспортировать имя экспорта так, как я хочу?
Спасибо
3 ответа
Нет. Все имена __stdcall оформлены таким образом. Я поражен, что у вас есть какой-то другой компилятор, который не будет ожидать, что экспорт __stdcall будет оформлен так. Заменить компоновщик с помощью.def - это почти все, что вы можете сделать, если только вы не хотите изменять PE-файл после производства.
Я не понимаю, почему вы не хотите использовать файл.def, но это ваш единственный вариант.
Компоновщик поддерживает переключатель экспорта, но его нельзя использовать с функциями, аннотированными __stdcall:
http://msdn.microsoft.com/en-US/library/7k30y2k5.aspx
Путь к файлу def является практически единственным решением.
Да:
Можете добавить /EXPORT
к lib.exe
командной строки или добавить #pragma
в ваш исходный файл:
#pragma comment(linker, "/EXPORT:SomeFunction=_SomeFunction@@@23mangledstuff#@@@@")
Или даже проще: внутри тела функции использовать
#pragma comment(linker, "/EXPORT:" __FUNCTION__ "=" __FUNCDNAME__)
Источник: /questions/13602291/c-dll-export-ukrashennyie-iskazhennyie-imena/13602323#13602323