![]() |
|
|
![]()
|
|
| gustavomarginale |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 2.7.2008 Репутация: нет Всего: нет |
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? ... |
|||
|
||||
| Earnest |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Дело в том, что выполнение программы начинается вовсе не с main или WinMain. Управление твоему коду передается в этой точке, но все начинается чуть раньше, со стандартного кода.
Нет, конечно, просто из библиотеки могут браться не все объектники,
А что им мешает? Они в разных объектниках живут. Какой механизм использует линкер, чтобы разобраться между ними, я точно не знаю, но как-то разбирается и выбирает подходящий. Насколько я знаю, main или WinMain в пользовательском коде должна быть обязательно. Конфликт, скорее всего, заключается в наличии 2 функций main - в твоем коде и в стандартном (т.к. WinMain вызывается из main, которая есть в стандартном коде). Странный аргумент. Если работа с библиотекой (в данном случае QT) подразумевает пользовательскую WinMain, надо писать, если нет - должны быть примеры, как построить приложение. Скажем, при использовании MFC свой WinMain писать не нужно, подключается стандартный. -------------------- ... |
||||
|
|||||
| Lowe |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 2.12.2011 Репутация: нет Всего: нет |
может проблема в типе проекта?
должно быть консольное, а выбрал Win32 ? Это сообщение отредактировал(а) Lowe - 12.12.2011, 14:57 |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |