Когда компилятор / компоновщик MSVC синтезирует скалярный / векторный деструктор удаления - PullRequest
0 голосов
/ 11 октября 2019

При работе с существующим проектом, после внесения некоторых изменений в некоторые внешние библиотеки, я сталкиваюсь с проблемами следующего типа при построении библиотеки, зависящей от другой динамически связанной библиотеки:

ошибка LNK2001: неразрешенный внешний символ "public: virtual void * __cdecl Foo ::` скалярный деструктор удаления "(unsigned int)

ошибка LNK2001: неразрешенный внешний символ" public: virtual void * __cdecl Foo :: `деструктор удаления вектора '(unsigned int)

Если я запускаю dumpbin /symbols в испорченном файле .obj, я ясно вижу эти символы как UNDEF.

Что меня интересует, так это то, что нет никаких претензий к другим неопределенным символам, а деструктор для Foo вообще не указан в дампе символа объектного файла. Основные ссылки на эти синтезированные функции, которые я могу найти в StackOverflow, принадлежат людям, которые не определили свой деструктор, однако я ясно вижу, что Foo::Foo экспортируется из библиотеки, в которой определен Foo (при запуске dumpbin /exports на.lib).

Это подводит меня к сути моего вопроса: когда Visual Studio (2015) решает синтезировать эти функции и когда решает, что они должны быть связаны с другим модулем перевода?

...