2013-06-28 4 views
3

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

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

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

+0

Пробовал и работал. –

+0

@Elmue - реорганизуйте это в Q & self-A пару, и я могу дать вам преимущество для него ... (два upvotes, даже;) – LThode

+0

Вы правы. Я сделал это. – Elmue

ответ

1

ВАЖНО: 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 в Релиз строит, чтобы уменьшить размер файла.

Зная это решение очень простое:

раствор А) Удалить _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ü