Неловкий раздел экспорта DLL - PullRequest
       87

Неловкий раздел экспорта DLL

2 голосов
/ 30 сентября 2011

У меня есть раздел кода C ++ в MSVC2010, который создает оболочку DLL. Часть кода выглядит примерно так ...

extern "C" __declspec(dllexport) DWORD myDllExportFunction()
{
    return (DWORD)SomeFunction(SomeParameter);
}

или ...

_declspec(dllexport) int64 _stdcall myDllExportFunction2(<someType> someParameter){
{
    return new (DWORD)SomeExternalFunction(SomeParameter);
}

Я ожидал бы, что мой раздел экспорта будет создавать дампбин на этой dll, который будет содержать только полное имя функции, однако это выглядит примерно так:

 _myDllExportFunction@12 = _myDllExportFunction@12

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

для обеспечения достаточного количества информации я включил некоторые из моих переключателей компилятора и компоновщика

Параметры компилятора:

/Zi /nologo /Wall /WX- /O2 /Ob2 /Oi /Oy- /D "_WINDLL" /D "_MBCS" /D "_AFXDLL" /Gm- /EHsc /GS /fp:precise /Zc:wchar_t /Zc

Параметры компоновщика:

/MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"C:\....\MyProj.pdb" /SUBSYSTEM:CONSOLE /OPT:REF /OPT:ICF /PGD:"C:\....\MyProj.pgd" /TLBID:1 /DYNAMICBASE:NO /NXCOMPAT:NO /IMPLIB:"MyProj.lib" /MACHINE:X86 /ERRORREPORT:QUEUE 

Примечание: /IMPLIB:"MyProj.lib "-> Эта библиотека импорта содержит все экспорты, которые я хочу иметь в моей DLL, в том формате, в котором я хочу, чтобы они были в dll.

Есть ли в моих проектах какие-либо настройки, которые могли бы вызвать это? Были ли какие-либо изменения в dllexport за последние годы, которые я мог пропустить? Могу ли я предоставить вам какую-либо информацию, которая поможет вам понять мою проблему?

Ответы [ 4 ]

3 голосов
/ 30 сентября 2011

Попробуйте отключить генерацию отладочной информации.

enter image description here

0 голосов
/ 30 сентября 2011

Существует несколько различных вариантов предотвращения искажения имени.

  • Измените спецификатор объявления для экспортируемой функции с __stdcall на __cdecl.Таким образом, сигнатура функции должна выглядеть следующим образом:

    extern "C" DWORD __declspec(dllexport) __cdecl myDllExportFunction()

Если вам нужно использовать соглашение о вызовах __stdcall, используйте один из следующих двух способов обойти имяковеркание.В обоих случаях вам не нужно добавлять __declspec(dllexport) к определению функции (но это нормально, если вы это делаете).

  • Добавить файл .def в проект, содержащий строки

БИБЛИОТЕКА YourLibraryNameEXPORTS
myDllExportFunction

  • В свойствах проекта перейдите к Linker -> Командная строка и в поле редактирования для Дополнительные параметры добавить/export:myDllExportFunction
0 голосов
/ 30 сентября 2011

Если вы хотите управлять именами экспортируемых функций (например, для удаления искажения), вам нужно использовать файл компоновщика определение модуля (.def), файл .

0 голосов
/ 30 сентября 2011

Вы искали имя, объявив его __stdcall, предположительно в отдельной декларации.Вы должны дать ему __cdecl соглашение о вызовах, чтобы избежать искажения имени.

...