Ошибка при статической сборке приложения Windows - PullRequest
3 голосов
/ 29 апреля 2011

У меня есть приложение, которое компилируется и работает нормально, когда я динамически связываю все, но когда я хочу иметь статическую сборку, оно не компилируется.

В Visual Studio 2010 я установил параметр «Использовать MFC в статической библиотеке».

Когда я это делаю, я получаю эту ошибку:

Ошибка 1, ошибка LNK2001: неразрешенный внешний символ _wWinMain @ 16 LIBCMT.lib (wwincrt0.obj)

Я пытался добавить LIBCMT.lib в качестве дополнительной библиотеки, но это ничего не меняет.

Есть идеи, как решить эту проблему?

Ответы [ 2 ]

2 голосов
/ 30 апреля 2011

Из сообщения об отсутствии WinMain, которое подразумевает для меня, что какой-то фрагмент вашего проекта создается как приложение, а НЕ как библиотека.

Попробуйте выполнить полную перестройку и убедитесь, что установлены все соответствующие параметры для создания статической библиотеки. Я считаю, что libcmt.lib должен быть связан только с вашим окончательным приложением, а НЕ с библиотекой.

1 голос
/ 30 апреля 2011

Когда вы собираете программу, есть флаги компилятора для установки Unicode / MBCS, Multi / Single Threading и различных других вещей. Если вы компилируете какой-либо источник с одним набором флагов, а другой источник с другими флагами, то вы часто получаете подобные ошибки компоновщика.

Убедитесь, что во всех источниках используются одинаковые флаги, включая любые ваши собственные библиотеки.

У вас есть конкретная ошибка, которая говорит о том, что компоновщик включает двоичный файл wwincrt0.obj из библиотеки LIBCMT.lib. wwincrt0.obj ссылается на функцию wWinMain (), и компоновщик не знает, где ее найти.

LIBCMT - многопоточная версия LIBC. Вы будете ссылаться на один из них, но не на оба.

wwincrt0 - это широкая (UNICODE) версия кода запуска CRT (C Run Time), которая запустит ваш код.

WinMain () - основная функция Windows, а wWinMain () - широкая (UNICODE) версия WinMain ().

Я предполагаю, что часть вашего кода скомпилирована с флагом компилятора / MT, а часть скомпилирована с другим флагом (/ MTd, / MD, / MDd, / LD или / LDd).

Мое второе замечание: некоторые скомпилированы с / DUNICODE, а другие с /DMBCS.

...