Да, я знаю, что на Stackoverflow уже есть сотни сообщений о LNK2001.
Но никто из них не решил мою проблему.
Поэтому я выкладываю свое решение здесь.
Симптом:
DLL-библиотека ATL нормально компилируется как Debug, но завершается с ошибкой, скомпилированной как Release.
Застрял на час в интернете и нашел бесполезные подсказки типа «Вы определили функцию main ()?» Я думаю, что я должен опубликовать решение для моей конкретной проблемы.
ВАЖНЫЙ: LNK2001 может иметь миллионы причин!
Если мое решение не помогает в ВАШЕМ конкретном случае, и если эта страница не помогает ни: http://msdn.microsoft.com/en-us/library/f6xx1b1z%28v=vs.71%29.aspx
затем не забудьте включить в свой поиск как можно больше ключевых слов. Как в моем случае «LIBCMT.lib LNK2001 _main». Это важно, чтобы не утонуть в миллионах результатов поиска.
LIBCMT.LIB определяет такие функции, как memcpy, swprintf и т. Д., Которые являются функциями CRT. (C Runtime Library)
Я использую некоторые из этих функций в своем проекте. Так почему же версия Debug строит, а версия Release нет?
Причина в том, что библиотека CRT требует инициализации, она имеет код запуска, который необходимо вызвать один раз (обычно во время _main)
Если проект определяет _ATL_MIN_CRT, код запуска CRT исключен из Exe, Dll в Release строит для уменьшения размера файла.
Зная это, решение простое:
Решение А) Удалить _ATL_MIN_CRT из настроек проекта
Решение Б) В конце файла Stdafx.h поместите эту строку:
#undef _ATL_MIN_CRT
Это решило проблему.
Поскольку я повторно использую свой класс в других проектах, я ставлю в начале моего класса:
#ifdef _ATL_MIN_CRT
#error _ATL_MIN_CRT is not valid for this project
#endif
Это гарантирует, что повторное использование моего кода в другом проекте в будущем будет немедленно предупреждено.
Elmü
Других решений пока нет …