2011-09-30 3 views
2

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

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

или ...

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

Я хотел бы ожидать моего экспорта раздел от делать DUMPBIN на этой DLL, чтобы содержать только полное имя функции однако это больше похоже на это.

[email protected] = [email protected] 

Я не знаю, почему этот знак равенства есть или что это значит. У меня сильное чувство, что функция недоступна для программ, которые импортируют 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 за последние годы, которые я, возможно, пропустил? Есть ли какая-то информация, которую я мог бы предоставить вам, которая поможет вам понять мою проблему?

+1

Удалите файл .pdb, чтобы получить менее путаный вывод. –

ответ

3

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

enter image description here

+0

Это не влияет на имена экспортируемых функций. –

+0

@BenVoigt Это была ошибка, которую я описывал в проблеме. +1, но недостаточно rep to: * ( – Satyrn

0

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

+0

'__cdecl' не избегает манипуляции с именем, он просто меняет правила. –

+0

@BenVoigt Это, похоже, удалило mangling, когда я пробовал это, однако я не просил удалить (я все еще хотел видеть). – Satyrn

+0

@Ben: Это может повлиять на определение имени: http://msdn.microsoft.com/en-us/library/x7kb4e2f.aspx –

0

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

+0

Мне не нужно удалять имя mangling, однако я пробовал это, и у меня возникают ошибки компоновщика, что заставляет меня думать, что он не находит эти методы в моих классах C. Вот пример файла def ... [code] LIBRARY myProjectname ЭКСПОРТ «myDllExportFunction @ 12» [/ code] – Satyrn

+0

@Satyrn: просто поместите имя функции в файл .def, например 'LIBRARY myProjectname EXPORTS myDllExportFunction' , Без кавычек, без аннотации размера стека. Возможно, вам понадобится «ЭКСПОРТ myDllExportFunction = _myDllExportFunction @ 12', но обычно этот компоновщик показывает это. Обращайте внимание на ведущие подчеркивания. –

+0

Я нашел решение в ответах других лиц, однако просто попытка использовать файл def дает мне LNK2001 ошибки «неразрешенный внешний символ», и я не знаю, почему. Я удалил имя mangling в файлах def для каждой из моих функций. – Satyrn

0

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

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

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

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

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

БИБЛИОТЕКА YourLibraryName
ЭКСПОРТА
        myDllExportFunction

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

Я думаю, что список экспортируемых функций находится под ключевым словом 'EXPORTS', а не с той же строкой. И имена функций '__cdecl' по-прежнему будут искажены с помощью подчеркивания. –

+0

@BenVoigt Спасибо, вы правы в синтаксисе файла def. Но имена функций '__cdecl' не искажены с лидирующим подчеркиванием, у меня есть рабочий проект, открытый перед мной, что доказывает обратное. – Praetorian

+0

x86 или x64. Это также меняет правила. http://en.wikipedia.org/wiki/Name_mangling#C_name_decoration_in_Microsoft_Windows –

Смежные вопросы