LIBCMT.lib: ошибка LNK2001: неразрешенный внешний символ _main

Да, я знаю, что на Stackoverflow уже есть сотни сообщений о LNK2001.
Но никто из них не решил мою проблему.
Поэтому я выкладываю свое решение здесь.

Симптом:
DLL-библиотека ATL нормально компилируется как Debug, но завершается с ошибкой, скомпилированной как Release.

Застрял на час в интернете и нашел бесполезные подсказки типа «Вы определили функцию main ()?» Я думаю, что я должен опубликовать решение для моей конкретной проблемы.

3

Решение

ВАЖНЫЙ: 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ü

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]