Сколько подчеркиваний ('_') в экспортированной функции в C ++ - PullRequest
0 голосов
/ 21 октября 2019

У меня есть сборка проекта dll в Visual Studio 2015. Я использую файл .def для экспорта функций. Однако я не могу понять, как компилятор префикс подчеркивания (_) для моих функций. В некоторых местах это добавляет 1 подчеркивание, в некоторых местах 2 и даже в некоторых местах 3.

У меня есть функция с именем Object() в моем коде для этой Visual Studio, кажется, генерирует много версий, таких как __imp____Object, __imp___Object и __imp__Object. Я не могу понять, почему так много версий.

Проблема, с которой я сталкиваюсь, даже если я добавил ___Object и __Object в свой файл .def, я получаю следующую ошибку компоновщика:

error LNK2001: unresolved external symbol __imp___Object

Любые предложения, что здесь происходит.

1 Ответ

0 голосов
/ 22 октября 2019

Кажется, компилятор следует шаблону для декорирования этих экспортируемых функций. На платформе x86 с _cdecl calling convention для каждой функции, экспортируемой через .def file или __declspec(dllexport), файл .lib содержит 2 записи. Одна в качестве имени функции с префиксом _, а другая с префиксом __imp__

Например, если def file имеет экспортированную функцию как Function1, библиотека будет иметь _Function1 и __imp__Function1

Это изменится для x64 и других соглашений о вызовах функций.

С учетом сказанного выше, мой случай был особенным. Мой файл определения имел Object, _Object и __Object, что должно привести к _Object, __imp__Object, __Object, __imp___Object, ___Object и __imp____Object.

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

ошибка LNK2001: неразрешенный внешний символ __imp ___ Object

...