| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Visual C++/MFC/WTL > VS linker. /SUBSYSTEM:..., ___tmainCRTStartup. |
| Автор: gustavomarginale 8.5.2011, 11:00 |
| 1. Намеренно собираем exe-файл из obj-файлов, в которых нет функций main() или WinMain(). 1) Указываем линкеру опцию /SUBSYSTEM:CONSOLE. MSVCRTD.lib(crtexe.obj) : error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup. 2) Указываем линкеру опцию /SUBSYSTEM:WINDOWS. MSVCRTD.lib(crtexew.obj) : error LNK2019: unresolved external symbol _WinMain@16 referenced in function ___tmainCRTStartup Скобочки после MSVCRTD.lib содержат конкретный источник ошибки (один из obj-файлов, из которых собран MSVCRTD.lib). MSVCRTD.lib относится к неявным либам, которые линковщик линкует с программой. Неужели эта либа собирается линковщиком при каждой линковке моей программы, причём из разных obj-файлов в зависимости от опции /SUBSYSTEM? MSVCRTD.lib в готовом виде лежит в папке C:\Program Files\Microsoft Visual Studio 9.0\VC\lib. Изменения - 2007 год. Если она НЕ собирается при каждой линковке, тогда очень интересный вопрос: 1) как в одном lib могут жить два символа с одинакоым именем "___tmainCRTStartup", один из которых хочет _WinMain, второй _main? 2) Как внутри линкера осуществляется выбор между ними на основании опции /SUBSYSTEM? 2. Добавляем в исходник main(). А приложение пишем с использованием Qt, т.е. линкеру передаём /SUBSYSTEM:WINDOWS. А WinMain()-то у нас по прежнему нету. И линкер говорит снова: MSVCRTD.lib(crtexew.obj) : error LNK2019: unresolved external symbol _WinMain@16 referenced in function ___tmainCRTStartup Не хочется писать WinMain с её четырьмя аргументами. Решение такое: сказать линкеру про библиотеку qtmain.lib. В ней определён WinMain, такой специальный Qt-шный WinMain, который вызывает int main(int,char**), который у нас как раз есть. Всё хорошо линкуется, но появляется warning: MSVCRTD.lib(cinitexe.obj) : warning LNK4098: defaultlib 'msvcrt.lib' conflicts with use of other libs; use /NODEFAULTLIB:library Как это понимать? В чём конфликт между MSVCRTD.lib c qtmain.lib? ... |
| Автор: Lowe 12.12.2011, 14:31 |
| может проблема в типе проекта? должно быть консольное, а выбрал Win32 ? |