Поиск:

Ответ в темуСоздание новой темы Создание опроса
> VS linker. /SUBSYSTEM:..., ___tmainCRTStartup. Загадочная природа MSVCRTD.lib. 
:(
    Опции темы
gustavomarginale
Дата 8.5.2011, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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?


...

PM MAIL   Вверх
Earnest
Дата 10.5.2011, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Дело в том, что выполнение программы начинается вовсе не с main или WinMain. Управление твоему коду передается в этой точке, но все начинается чуть раньше, со стандартного кода.
Цитата(gustavomarginale @  8.5.2011,  12:00 Найти цитируемый пост)
Неужели эта либа собирается линковщиком при каждой линковке моей программы,

Нет, конечно, просто из библиотеки могут браться не все объектники, 

Цитата(gustavomarginale @  8.5.2011,  12:00 Найти цитируемый пост)
как в одном lib могут жить два символа с одинакоым именем "___tmainCRTStartup", один из которых хочет _WinMain, второй _main?

А что им мешает? Они в разных объектниках живут.
Какой механизм использует линкер, чтобы разобраться между ними, я точно не знаю, но как-то разбирается и выбирает подходящий.

Насколько я знаю, main или WinMain в пользовательском коде должна быть обязательно.

Конфликт, скорее всего, заключается в наличии 2 функций main - в твоем коде и в стандартном (т.к. WinMain вызывается из main, которая есть в стандартном коде).
Цитата(gustavomarginale @  8.5.2011,  12:00 Найти цитируемый пост)
Не хочется писать WinMain с её четырьмя аргументами.

Странный аргумент. Если работа с библиотекой (в данном случае QT) подразумевает пользовательскую WinMain, надо писать, если нет - должны быть примеры, как построить приложение. Скажем, при использовании MFC свой WinMain писать не нужно, подключается стандартный. 


--------------------
...
PM   Вверх
Lowe
Дата 12.12.2011, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 2.12.2011

Репутация: нет
Всего: нет



может проблема в типе проекта?

должно быть консольное, а выбрал Win32 ?

Это сообщение отредактировал(а) Lowe - 12.12.2011, 14:57
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0469 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.