Как экспортировать чистые виртуальные функции из DLL в C ++? - PullRequest
4 голосов
/ 02 октября 2010

У меня странная проблема: ни одна чисто виртуальная функция не экспортируется из DLL. DLL компилирует и выводит как .dll файл в каталог. Но он не производит файл .lib.

Если я даю определение, и оно больше не воспринимается как чисто виртуальное, то после этого, к счастью, создается файл .lib.

Мне нужно реализовать фабричный шаблон, для которого мне нужно разделить интерфейсы и реализации. Моя фабричная реализация и другие интерфейсы, которые используют требуемый .dll (из которого .lib файл не производит), должны использовать эту экспортированную функцию, и когда я использую эти функции, они вызывают ошибки компоновки ...

например, "ошибка LNK2011: неразрешенный внешний символ" public: ....... "

Есть какая-нибудь идея, как экспортировать чисто виртуальные функции, чтобы они могли быть реализованы для других exe и dll

С уважением Усман

Ответы [ 3 ]

8 голосов
7 голосов
/ 02 октября 2010

Когда вы экспортируете что-то из DLL, вы создаете внешне видимое имя для чего-то конкретного в этой DLL - определенной функции или класса. Без этого шаг ссылки для импорта проектов (тех, которые ссылаются на эту DLL) не может разрешить все необходимые ссылки на функции и классы в экспортируемой DLL.

Для чисто виртуальных функций в экспортируемой DLL нет конкретной «вещи»: не может существовать связываемое имя для разрешения внешнего вызова чистой виртуальной функции - если бы она существовала, она по определению не была бы чистой. В этом случае все, что нужно, - это объявление в доступном во время компиляции заголовочном файле чисто виртуальной функции, чтобы при импорте EXE-файлов или DLL-файлов можно было переопределить их конкретной функцией.

1 голос
/ 02 октября 2010

В C ++ вы можете определить чисто виртуальный метод.Например:

// T.hpp
class T
{
   public :
      virtual void doSomething() = 0 ;
      // etc.
} ;

.

// T.cpp
void T::doSomething()
{
}

// etc.

Теперь, когда в класс T добавлен спецификатор dllexport / dllimport, будет экспортирован метод doSomething.

Смысл определения тела чисто виртуального метода состоял в том, чтобы убедиться, что пользователь переопределит метод, при этом предлагая реализацию по умолчанию.

Мое собственное использование этого шаблона состоит в том, чтобы избежать сбоя, когда дляпо какой-то причине виртуальный метод вызывается до того, как он существует, или когда он больше не существует (т. е. в конструкторе или деструкторе базового абстрактного класса).В режиме отладки он запустит отладчик (::DebugBreak() функция Win32 API), а в режиме выпуска он ничего не сделает.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...