C ++: поиск украшенных имен - PullRequest
       49

C ++: поиск украшенных имен

4 голосов
/ 10 октября 2008

Как я могу узнать оформленное имя, которое будет присвоено каждому имени метода? Я пытаюсь выяснить, что такое оформленное имя, чтобы я мог его экспортировать в DLL.

Ответы [ 6 ]

7 голосов
/ 11 октября 2008

.DEF-файл все еще используется?

Забудьте .DEF файлы. Они ушли в прошлое.

Экспорт ваших функций, будь то функции C или символы C ++, через __declspec (dllimport / dllexport).

Если вам действительно нужны недекорированные имена, используйте, как предлагает Грег Хьюгилл, ключевые слова __declspec (dllimport / dllexport) в сочетании с extern "C", которые уберут эти символы с их украшения ...

Вы уверены, что хотите удалить украшение C ++?

Для этого есть несколько веских причин: вы хотите экспортировать код, который будет использоваться кодом C, или вы хотите использовать вашу DLL из модулей, скомпилированных с разными компиляторами.

И по второй причине я вместо этого создаю по одной DLL на компилятор и сохраняю декорации.

Помимо этих причин, почему вы хотите убрать украшения?

C ++ украшения / искажение имени не зло

Совсем наоборот.

Если вы работаете с одним компилятором (, и я полагаю, что вы это делаете, потому что вы хотите использовать декорированные имена, а не внешние "C" ), тогда сохраните декорацию C ++ украшения / имени.

Таким образом, вы сможете использовать всю мощь C ++, то есть пространства имен, классы, перегрузки функций / методов и т. Д.

Тем не менее, игра вручную с украшениями символов - это путь к катастрофе: используйте dllexport, чтобы экспортировать ваши символы без необходимости иметь дело с еще одним (.DEF) файлом.

5 голосов
/ 10 октября 2008

Этот вопрос очень похож: Экспорт DLL C ++ Class, вопрос о файле .def . Вкратце, вы, вероятно, захотите использовать __declspec(dllexport), чтобы позволить компилятору выполнить экспорт ваших методов за вас.

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

2 голосов
/ 17 октября 2008

Используя dumpbin в объектном файле, вы найдете все методы, используемые в объекте. Вот как это используется

dumpbin /symbols File.obj
2 голосов
/ 10 октября 2008

Поскольку искажение имени в C ++ не совпадает между различными компиляторами (как упоминалось Грег Хьюгилл , оно может меняться даже между версиями компилятора одного и того же производителя), и для C ++ нет стандартного двоичного интерфейса, Обычно не очень хорошая идея экспортировать функции C ++ из DLL. Исключением может быть, если DLL-библиотека тесно связана с приложением, использующим ее, и поддерживает ее версию.

Альтернативой является объявление экспортированных функций как extern "C".

0 голосов
/ 01 мая 2009

В VS2005 есть макрос препроцессора FUNCDNAME , который возвращает строку с декорированным именем, когда помещается в функцию. Это, однако, нестандартно - стандарт C99 имеет func для этого, и я не могу сказать, поддерживает ли ваш компилятор это.

(почему знаки подчеркивания не отображаются должным образом?)

(править :) Это, по-видимому, недавно появилось в аналогичном обсуждении .

0 голосов
/ 10 октября 2008

Я думаю, что вы должны принять совет предыдущих 2 респондентов Грег Хьюгилл и Майк B , но если вы используете цепочку инструментов Microsoft, и вы действительно хотите знать, украшенные имя (ы) ...

  1. Создайте свои .lib и .dll файлы, используя __ declspec (dllexport)
  2. Проверка имен, экспортируемых dll, используя dumpbin / exports
  3. Теперь вы можете удалить __ declspec (dllexport) и экспортировать символы вручную в файл .def
...