Russian Qt Forum

Qt => Установка, сборка, отладка, тестирование => Тема начата: usr00210 от Август 25, 2010, 13:45



Название: Проблема с линковкой (unresolved externals)
Отправлено: usr00210 от Август 25, 2010, 13:45
Всем привет!

1. Скачал и установил Qt SDK 2010.04 для Windows. При установке не устанавливал minGW (хочу использовать Qt Creator как IDE + VS2005 tools).
2. Создаю простейшее приложение из пары строк типа QCoreApplication a(argc, argv);
3. По умолчанию проект (Makefile.debug) требует QtCored4.lib (т.е.) динамическая линковка Qt-шных библиотек, но я .lib файлов вообще не наблюдаю в директории /lib - только статические архивы .а
4. Руками в Makefile.debug меняю LIBS на QtCored4.а и получаю несколько unresolved:

main.obj:: error:  unresolved external symbol "__declspec(dllimport) public: virtual __thiscall QCoreApplication::~QCoreApplication(void)" (__imp_??1QCoreApplication@@UAE@XZ)
main.obj:: error:  unresolved external symbol "__declspec(dllimport) public: static int __cdecl QCoreApplication::exec(void)" (__imp_?exec@QCoreApplication@@SAHXZ)
main.obj:: error:  unresolved external symbol "__declspec(dllimport) public: __thiscall QCoreApplication::QCoreApplication(int &,char * *)" (__imp_??0QCoreApplication@@QAE@AAHPAPAD@Z)

т.е. что-то не так с библиотеками. вообще обычно архивы .а используются в Линухе.

Подскажите пожалуйста как обойти эти грабли?

пс. документация у Qt ужасная и бестолковая на мой взгляд =(


Название: Re: Проблема с линковкой (unresolved externals)
Отправлено: Авварон от Август 25, 2010, 13:51
вы либо юзаете Qt SDK как она есть (включая мингв), либо качаете либы для студии (бла бла VS2008 opensource development), по желанию качаете либо креатор, либо интегратор в студию и с ними работаете.
.а файлы - это не линуксовые библиотеки, а ggc'шные (то есть мингв). мингв либы qt (которые идут в поставке с SDK) и студийный компилер несовместимы

неужели доки в мсдн лучше? ахаха


Название: Re: Проблема с линковкой (unresolved externals)
Отправлено: BRE от Август 25, 2010, 13:53
1. Скачал и установил Qt SDK 2010.04 для Windows. При установке не устанавливал minGW (хочу использовать Qt Creator как IDE + VS2005 tools).
В SDK лежат собранные библиотеки MinGW, если хочешь использовать VS, то перекомпилируй Qt этим компилятором.

пс. документация у Qt ужасная и бестолковая на мой взгляд =(
Удивило.  ::)
Это ты наверное MSDN сравниваешь?


Название: Re: Проблема с линковкой (unresolved externals)
Отправлено: usr00210 от Август 25, 2010, 13:54
вы либо юзаете Qt SDK как она есть (включая мингв), либо качаете либы для студии (бла бла VS2008 opensource development), по желанию качаете либо креатор, либо интегратор в студию и с ними работаете.
.а файлы - это не линуксовые библиотеки, а ggc'шные (то есть мингв). мингв либы qt (которые идут в поставке с SDK) и студийный компилер несовместимы

неужели доки в мсдн лучше? ахаха

Спасибо за ответ! Смутно подозревал именно это =)

Сейчас на этапе новичка Qt для меня доки мсдн действительно _значительно_ лучше Qt-шных. По крайней мере речь идет о тех, которые включены в SDK.


Название: Re: Проблема с линковкой (unresolved externals)
Отправлено: Alex_cs_gsp от Август 25, 2010, 15:19
Мне тоже MSDN намного больше нравится.


Название: Re: Проблема с линковкой (unresolved externals)
Отправлено: Авварон от Август 25, 2010, 15:20
/*тычет пальцем и смеется*/


Название: Re: Проблема с линковкой (unresolved externals)
Отправлено: usr00210 от Август 25, 2010, 15:43
/*тычет пальцем и смеется*/

звезд много, а смеешься =)
понятно ведь, что это дело привычки.

у меня другая проблема возникла. помогите ее разрешить пожалуйста!

установил библиотеки для VS2008 (у меня стоит 2005). проект линкуется в статике (размер исходника 440КБ).
но при попытке запустить простейшее приложение вылетает ошибка: The application failed to initialize properly (0xc0150002). Click OK to terminate the application.

Dependency Walker говорит, что QtCored4.DLL правильная, но внутри нее есть обращения к MSVCP90D.DLL которого в системе нет.
Возможно в этом дело.

QMAKESPEC=win32-msvc2005
QTDIR=C:\Nokia\MSVC



Название: Re: Проблема с линковкой (unresolved externals)
Отправлено: Авварон от Август 25, 2010, 15:57
звезд много, а смеешься =)
понятно ведь, что это дело привычки.

у меня другая проблема возникла. помогите ее разрешить пожалуйста!

установил библиотеки для VS2008 (у меня стоит 2005). проект линкуется в статике (размер исходника 440КБ).
но при попытке запустить простейшее приложение вылетает ошибка: The application failed to initialize properly (0xc0150002). Click OK to terminate the application.

Dependency Walker говорит, что QtCored4.DLL правильная, но внутри нее есть обращения к MSVCP90D.DLL которого в системе нет.
Возможно в этом дело.

QMAKESPEC=win32-msvc2005
QTDIR=C:\Nokia\MSVC



offtop: раз вы так ориентируетесь в мсдн, то в чем разница между System.IO.DriveInfo.Name и System.IO.DriveInfo.RootDirectory ( http://msdn.microsoft.com/ru-ru/library/system.io.driveinfo_properties.aspx ).

не оффтоп: я так полагаю, что дело в разнице версий кьюта и студии и ничегонесделать (с) По крайней мере так пишут тут: http://tech.vkapoor.com/2007/12/error-code-0xc0150002-application.html
PS: либы от 2008 в 10й работают, проверял лично (у меня одного кутя работает без нареканий?:))


Название: Re: Проблема с линковкой (unresolved externals)
Отправлено: usr00210 от Август 25, 2010, 16:14

offtop: раз вы так ориентируетесь в мсдн, то в чем разница между System.IO.DriveInfo.Name и System.IO.DriveInfo.RootDirectory ( http://msdn.microsoft.com/ru-ru/library/system.io.driveinfo_properties.aspx ).

не оффтоп: я так полагаю, что дело в разнице версий кьюта и студии и ничегонесделать (с) По крайней мере так пишут тут: http://tech.vkapoor.com/2007/12/error-code-0xc0150002-application.html
PS: либы от 2008 в 10й работают, проверял лично (у меня одного кутя работает без нареканий?:))

на первый вопрос не отвечу, не моя специализация =)

а вот построив приложение в Release конфигурации у меня получилось ее запустить без проблем. При этом QTCORED4.DLL все таже... т.е надо найти 10 отличий между сборками в Release и Debug со стороны Qt. Пробовал патчить mkspecs\win32-msvc2005\qmake.conf, как в местой вики сказано, но результатов нет. Может что-то еще?


Название: Re: Проблема с линковкой (unresolved externals)
Отправлено: Авварон от Август 25, 2010, 16:18
хм, а как вы прилинковали релиз приложение к дебагнутым библиотекам?


Название: Re: Проблема с линковкой (unresolved externals)
Отправлено: usr00210 от Август 25, 2010, 16:29
хм, а как вы прилинковали релиз приложение к дебагнутым библиотекам?

никак, линковка с релиз библиотеками. я имел ввиду то, что релиз QtCore4 также ссылается на несуществующую ДЛЛ, что не мешает приложению запускаться.

(http://img829.imageshack.us/img829/4163/77066680.jpg)


Название: Re: Проблема с линковкой (unresolved externals)
Отправлено: Hellraiser от Август 25, 2010, 18:30
Сильно подозреваю, что какая-то программа притащила с собой рантайм 2008 студии (msvcp90.dll и msvcr90.dll). Но этот рантайм только для релизных версий библиотек. Поэтому релиз работает, а дебаг - нет. Дебажный рантайм, насколько я знаю, ставит только сама студия.


Название: Re: Проблема с линковкой (unresolved externals)
Отправлено: usr00210 от Август 26, 2010, 01:42
Сильно подозреваю, что какая-то программа притащила с собой рантайм 2008 студии (msvcp90.dll и msvcr90.dll). Но этот рантайм только для релизных версий библиотек. Поэтому релиз работает, а дебаг - нет. Дебажный рантайм, насколько я знаю, ставит только сама студия.

Предположение не верно.

1. рантайм 2008 это не msvcp90.dll и msvcr90.dll, а msvcp80.dll и msvcr80.dll (пардон, с утра плохо вижу =) я говорил о 2005 студии)
2. msvcp90.dll и msvcr90.dll не обнаруживается в стандартных путях, о чем нам и сообщает Dependency Walker (см. выше)


Название: Re: Проблема с линковкой (unresolved externals)
Отправлено: Hellraiser от Август 26, 2010, 19:42
2. msvcp90.dll и msvcr90.dll не обнаруживается в стандартных путях, о чем нам и сообщает Dependency Walker (см. выше)
Их там и не должно быть: внимательно изучаем содержание папочки %WINDIR%\WinSxS. Это Dependancy Walker не может найти, а винда свой (мелкомягкий) рантайм знает где искать.


Название: Re: Проблема с линковкой (unresolved externals)
Отправлено: usr00210 от Август 28, 2010, 11:48
2. msvcp90.dll и msvcr90.dll не обнаруживается в стандартных путях, о чем нам и сообщает Dependency Walker (см. выше)
Их там и не должно быть: внимательно изучаем содержание папочки %WINDIR%\WinSxS. Это Dependancy Walker не может найти, а винда свой (мелкомягкий) рантайм знает где искать.

удар в голову. жестокий и беспощадный. ;D спасибо за информацию, прожил бы вот так всю жизнь и не знал бы  ;D


Название: Re: Проблема с линковкой (unresolved externals)
Отправлено: Igors от Август 28, 2010, 11:58
Поэтому релиз работает, а дебаг - нет. Дебажный рантайм, насколько я знаю, ставит только сама студия.
Та отож. Случайно не знаете "штатного" способа установить debug runtime? Мне было бы удобно отдавать заказчику промежуточные версии как debug. Пытался копировать все dll, но увы  :-[

Спасибо


Название: Re: Проблема с линковкой (unresolved externals)
Отправлено: Hellraiser от Август 28, 2010, 14:18
Думаю помогут вот эти статьи : http://msdn.microsoft.com/en-us/library/aa985618%28v=VS.90%29.aspx (http://msdn.microsoft.com/en-us/library/aa985618%28v=VS.90%29.aspx) и http://msdn.microsoft.com/en-us/library/ms235291%28v=VS.90%29.aspx (http://msdn.microsoft.com/en-us/library/ms235291%28v=VS.90%29.aspx) (читать про private assemblies).


Название: Re: Проблема с линковкой (unresolved externals)
Отправлено: usr00210 от Август 29, 2010, 05:46
/*тычет пальцем и смеется*/

читая документацию, хочу еще раз высказаться - документация полной сакс. куча ошибок, от простейших грамматических в описании до совершенно тупых (копи-паст) и не очень в примерах и рефернс коде. к тому же как тут уже некоторые отмечали - нет нормального описания возвращаемых ошибок и исключений. ну и сами описания классов и функций очень бедные. сразу видно, что писали программисты, а не техрайтеры... короче, МСДН и ман рулят. и это уже не дело привычки.


Название: Re: Проблема с линковкой (unresolved externals)
Отправлено: Авварон от Август 29, 2010, 15:20
/*продолжает тыкать пальцем, уже лежа на полу*/
где же это вы ошибки-то нашли? а в винде прям так описаны все коды? рофл, если ф-ия вернула false, то действие одно - получайте код ошибки (GetLastError()) это по вашему хорошо документировано? то есть к каждой ф-ии написан список _всех_ кодов, к-ые она может вернуть? я что-то этого не видел


Название: Re: Проблема с линковкой (unresolved externals)
Отправлено: Alex_cs_gsp от Август 29, 2010, 17:04
GetLastError() лучше, чем ничего. Код ошибки сохраняете в лог., и можно узнать что привело к сбою. К тому же, все ошибки поделены на категории и можно легко сформировать сообщение для пользователя, что произошло. В Qt добрая половина методов возвращает бул. Вот, что с ним делать?


Название: Re: Проблема с линковкой (unresolved externals)
Отправлено: Авварон от Август 29, 2010, 17:12
а) юзера не волнует код ошибки, в любом случае он будет писать вам
б) 90% кодов ошибок бесполезны (инвалид хэндл, недостаточный буффер - с этим вообще ололол, мы передаем в ф-ии работы с ФС буфер и его длину, которая ВСЕГДА должна быть равна MAX_PATH и если ее не передаем, то ловим ошибку о малом буфере, вот внимание, а нафига вообще были все эти действия)
в) просто обрабатывать и писать что такая-то операция провалилась. Если нужна причина, есть класс Error (QSqlError или как-то так) или просто текстовое сообщение (QFile)
Метод bool removeRows в том примере виртуальный и требует переопределения. Если вы возвращаете false (а это в моделях 50/50 случается в данном методе) то ошибку обрабатываете как удобно _вам_ Либо делаете класс эррора, либо кидаете эксепшн, либо кидаете сигнал с кодом ошибки - как удобно именно вам. По дефолту да, тот метод возвращает false, но это не ошибка, а он просто ничего не делает, что в доке и написано


Название: Re: Проблема с линковкой (unresolved externals)
Отправлено: Alex_cs_gsp от Август 29, 2010, 18:05
Я не хвалю Windows, эта штуковина появилась когда о ООП слышали не многие, и мне кажется, что именно поэтому и придумали дот нет, так как был выбор не большой - либо переписывать систему и как-то решать вопросы с совместимостью, либо делать фреймворк, который использует тот-же вынь-апи. Я говорю, что над справкой Qt недоработали, так как когда переходишь с худшего на лучшее, то претензии обычно возникать не должны.


Название: Re: Проблема с линковкой (unresolved externals)
Отправлено: Авварон от Август 29, 2010, 18:14
все там доработали, если чего-то в ассистанте нет, то врядли это известно живым людям:)
по мсдн дот нета я спрашивал вопрос в начале темы, там тоже нихрена нет (кроме того что проперти "имя" возвращает имя, спс кэп)