Проблема с компоновщиком DLL - PullRequest
3 голосов
/ 10 сентября 2010

Я компилирую DLL дважды (один раз для x86, один раз для x64), и я установил / ENTRY в «DllMain».Я использую опцию / MT runtime library для статической связи с библиотекой времени выполнения.Все это прекрасно работает при сборке x86, но сборка x64 дает сбой с этим:

error LNK2019: unresolved external symbol main referenced in function __tmainCRTStartup
{project directory}\LIBCMT.lib(crt0.obj)

Почему это работает для сборки x86, а не сборки x64?Я что-то упускаю здесь?

Ответы [ 2 ]

1 голос
/ 10 сентября 2010

Не прямой ответ, но он может быть строго связан: как сказано в комментарии, вы должны избегать изменения точки входа таким образом: обычно реальная точка входа берется «поддельным» DllMain, предоставленным CRT, для инициализации его внутреннегоструктуры данных (как объяснено здесь ), так что вы обойдете их.Возможно, уменьшение размера связано с удалением кода инициализации CRT.

Ваша dll работает с неинициализированным CRT, что очень плохо.Вы должны оставить точку входа по умолчанию, что, кстати, должно решить вашу проблему.

Кстати, обратите внимание, что на самом деле вы могли бы сделать dll без CRT (и это стало бы действительно маленьким), но вы не должны использовать CRT вообще , даже не связываясь с ним (переключатель / NODEFAULTLIB ).Это означает, что вы можете просто использовать библиотеки, с которыми вы явно ссылаетесь (например, Windows API), но я подозреваю, что вы потеряете несколько функций C ++ (я думаю, по крайней мере исключения и RTTI).

0 голосов
/ 10 сентября 2010

Это может быть глупый вопрос, но вы уверены, что вы связываете как DLL в случае x64 (т.е. указываете переключатель /DLL) - поскольку жалоба касается main, мне интересно, пытается ли онасвязать как исполняемый файл?

...