C++ Экспорт DLL: Украшенные / Скорректированные имена

Созданный основной C++ DLL и экспортируемые имена с помощью файла Определения Модуля (MyDLL.def). После компиляции я проверяю экспортируемое использование имен функций dumpbin.exe Я ожидаю видеть:

SomeFunction

но я вижу это вместо этого:

SomeFunction = SomeFunction@@@23mangledstuff#@@@@

Почему?

Экспортируемая функция кажется неукрашенной (особенно по сравнению с не использованием файла Определения Модуля), но что произошло с другим материалом?

Если я использую dumpbin.exe против DLL из любого коммерческого применения Вы получаете чистое:

SomeFunction

и ничто иное...

Я также пытался удалить Определение Модуля и экспортировать имена с помощью "C" стиля экспорта, а именно:

extern "C" void __declspec(dllexport) SomeFunction();

(Просто использование "экстерна "C" не создало экспортируемую функцию),

Однако это все еще создает тот же вывод, а именно:

SomeFunction = SomeFunction@@@23mangledstuff#@@@@

Я также попробовал #define dllexport __declspec(dllexport) опция и созданный LIB без проблемы. Однако я не хочу должным быть предоставлять Библиотечный файл людям, использующим DLL в их приложении C#.

Это - простой ванильный C++ DLL (неуправляемый код), скомпилированный с C++ только простой заголовок и код. Без Определения Модуля я получаю искаженные экспортируемые функции (я могу создать статическую библиотеку и использовать LIB без проблем. Я стараюсь избегать этого). Если я использую extern "C" __declspec(dllexport) ИЛИ Определение Модуля, я получаю, что, кажется, неукрашенное имя функции... единственная проблема состоит в том, что оно сопровождается "=" и что похоже на украшенную версию функции. Я хочу избавиться от материала после "=" - или по крайней мере понять, почему это там.

В настоящий момент я вполне уверен, что я могу вызвать функцию от C# с помощью P/Invoke... Я просто хочу избежать что спам в конце "=".

Я открыт для предложений о том, как изменить проект/параметры компилятора, но я просто использовал стандартный шаблон Visual Studio DLL - ничто специальное.

26
задан vaxquis 12 April 2016 в 15:40
поделиться

5 ответов

Вы можете добиться желаемого, отключив генерацию отладочной информации. Project + Properties, Linker, Debugging, Generate Debug Info = No.

Естественно, вы хотите сделать это только для сборки Release. Где эта опция уже установлена.

16
ответ дан 28 November 2019 в 06:07
поделиться

Вместо использования файла .def просто вставьте pragma comment вот так

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

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

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

. ... . если вам трудно найти украшенное имя функции. Эта последняя прагма может быть еще более сокращена с помощью простого макроопределения.

40
ответ дан 28 November 2019 в 06:07
поделиться

Вы должны объявить функции как extern "C", если не хотите, чтобы их имена были искажены.

14
ответ дан 28 November 2019 в 06:07
поделиться

функция SomeFunction@@@23mangledstuff#@@@@ искажается, чтобы дать типы и класс функции C++. Простой экспорт - это функции, которые могут быть вызваны из Си, т.е. написаны на Си или объявлены как extern "C" в коде Си++. Если вы хотите простой интерфейс, то вам нужно сделать так, чтобы экспортируемые функции использовали только типы C и сделать их функциями-нечленами в глобальном пространстве имен.

0
ответ дан 28 November 2019 в 06:07
поделиться

В основном, когда вы используете функции в C++, части их имен теперь включают их сигнатуру и тому подобное, чтобы облегчить такие возможности языка, как перегрузка.

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

0
ответ дан 28 November 2019 в 06:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: