Как изменить оформление экспортированного имени для __stdcall в VC ++?

Вот как у меня объявлена ​​функция экспорта на данный момент:

extern "C" __declspec(dllexport)
Iexport_class* __stdcall GetExported_Class();

Когда VS2008 скомпилировал исходный код для этого, созданная dll содержала это в своей таблице экспорта:

_GetExported_Class@0

Для совместимости с другими компиляторами мне нужно, чтобы указанное выше оформление выглядело так:

GetExported_Class

Изменение соглашения о вызовах на __cdecl украсит его так, как я хочу, но соглашение было бы неправильным, поэтому я не могу его использовать. Мне нужно, чтобы он был оформлен так, как выглядит __cdecl, но вместо этого использует __stdcall.

Есть ли способ сделать это без использования файла .def? Есть ли переключатель или параметр, который я могу передать компоновщику link.exe, который может заставить его украсить имя экспорта так, как я хочу?

Спасибо


person greatwolf    schedule 21.12.2010    source источник


Ответы (3)


Нет. Таким образом оформляются все имена __stdcall. Я удивлен, что у вас есть другой компилятор, который не ожидает, что экспорт __stdcall будет оформлен таким образом. Переопределение компоновщика с помощью .def - это почти все, что вы можете сделать, если только вы не хотите изменять PE-файл после производства.

person Puppy    schedule 21.12.2010
comment
спасибо, думаю, мне просто придется пережить трудный путь. «Другими» компиляторами, которые не следуют соглашению, являются MinGW gcc 4.5.1 и Borland 5.93 (C ++ Builder 2007). Оба они просто выплевывают имя функции, которое не украшено - по крайней мере, когда я взломал его с помощью программы просмотра, чтобы проверить таблицы экспорта. - person greatwolf; 21.12.2010

Я не понимаю, почему вы не хотите использовать файл .def, но это ваш единственный вариант.

Компоновщик поддерживает переключатель экспорта, но его нельзя использовать с функциями, аннотированными __stdcall:

http://msdn.microsoft.com/en-US/library/7k30y2k5.aspx

Способ файла def - практически единственное решение.

person Paulo Pinto    schedule 21.12.2010
comment
в основном потому, что это дополнительные работы по техническому обслуживанию. Пытаюсь понять, есть ли более простой способ упростить это. - person greatwolf; 21.12.2010

Да:

Вы можете добавить /EXPORT в lib.exe командную строку или добавить #pragma в исходный файл:

#pragma comment(linker, "/EXPORT:SomeFunction=_SomeFunction@@@23mangledstuff#@@@@")

Или даже проще: внутри тела функции используйте

#pragma comment(linker, "/EXPORT:" __FUNCTION__ "=" __FUNCDNAME__)

Источник: https://stackoverflow.com/a/2805560/280534

person Kevin Smyth    schedule 14.06.2016