Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [QT4] переносимость программ


Автор: CuteBunny 28.5.2008, 14:55
Блин, собрал релизную версию программы, запихнул в корневую папку только нужные dlls, пытаюсь запустить на другой машине... 
"Ошибка в программе - отправить отчет и т.д. и т.п."??? В чем дело?

Автор: JackYF 28.5.2008, 15:35
Цитата(CuteBunny @  28.5.2008,  13:55 Найти цитируемый пост)
В чем дело? 

Собери дебаг-версию программу и запусти из консоли.

Добавлено через 25 секунд
99%, что дело в косяке в твоей программе, который нужно выявить.

Автор: Любитель 30.5.2008, 12:10

M
Любитель
CuteBunny, просьба не дублировать темы в следующий раз!


Добавлено через 2 минуты
Цитата(JackYF @  28.5.2008,  15:35 Найти цитируемый пост)
запусти из консоли.

Небольшая поправка - в винде все дебажные сообщения выводятся не в stdout/stderr, а с помощью DebugOutputString. То есть в консоле мы ничего не увидим. Либо с дебаггера, либо есть какая-т утила (точно уже не помню) от SysInternals, которая перехватывает дебажные сообщения.

Автор: SABROG 30.5.2008, 12:51
Цитата(Любитель @ 30.5.2008,  12:10)
Добавлено @ 12:12
Цитата(JackYF @  28.5.2008,  15:35 Найти цитируемый пост)
запусти из консоли.

Небольшая поправка - в винде все дебажные сообщения выводятся не в stdout/stderr, а с помощью DebugOutputString. То есть в консоле мы ничего не увидим. Либо с дебаггера, либо есть какая-т утила (точно уже не помню) от SysInternals, которая перехватывает дебажные сообщения.

Поправочка. Добавляем в .pro файл "CONGIF += console" и все видим.

Автор: CuteBunny 2.6.2008, 16:48
Добавил в pro файл строку CONFIG += console, теперь выскакивает консоль, там ничего не пишется, консоль потом быстро исчезает... 

Прочитал в assistant'e статью Deploying QT Applications, вроде шел по инструкциям, кинул нужные библиотеки, добавил в pro файл строку CONFIG -= embeded_manifest_dll - чтоб плагины работали на чужих машинах, добавил msvcr80.dll & msvcp80.dll правда в папке Visual C++ EE 2003 их не нашел, нашел в папке SDK, все равно не работает... Правда надо было еще скопировать папку  <Visual Studio Install Path>\VC\redist\<Architecture>\Microsoft.VC80.CRT, но у меня ее нет вообще...

Походу пора переходить на mingw...

Добавлено через 1 минуту и 20 секунд
Кстати, также пробовал запустить экзамплы на другой машине, таже ерунда...?...

Автор: SABROG 2.6.2008, 16:53
Цитата(CuteBunny @  2.6.2008,  16:48 Найти цитируемый пост)
теперь выскакивает консоль, там ничего не пишется, консоль потом быстро исчезает... 


Помимо этого надо прогу запускать тоже через консоль, тогда ничего не закрывается. Но дело не в консоле это и так понятно,  туда при всем желании ничего писаться не будет, если косяк с архитектурой или с кривыми прилинкованными библиотеками.

Автор: CuteBunny 2.6.2008, 16:56
Хмммм... Как лечится тогда?...

Автор: SABROG 2.6.2008, 17:04
Цитата(CuteBunny @ 2.6.2008,  16:56)
Хмммм... Как лечится тогда?...

А в программе точно нет ошибок ? У меня бывают "на ровном месте", когда какой-нибудь файлик изменю, а компилятор не перекомпилирует объектник. Приходится clean делать и собирать снова. Еще с дллками косяк у меня был, на двух тачках XP и 2000 две Qt собранные на каждой. Если перемещать .exeшник между тачками, не смотря на то, что на каждой есть .dll файлы, программа крашится.

Автор: Любитель 2.6.2008, 17:08
Цитата(CuteBunny @  2.6.2008,  16:48 Найти цитируемый пост)
Прочитал в assistant'e статью Deploying QT Applications, вроде шел по инструкциям, кинул нужные библиотеки, добавил в pro файл строку CONFIG -= embeded_manifest_dll - чтоб плагины работали на чужих машинах, добавил msvcr80.dll & msvcp80.dll правда в папке Visual C++ EE 2003 их не нашел, нашел в папке SDK, все равно не работает... Правда надо было еще скопировать папку  <Visual Studio Install Path>\VC\redist\<Architecture>\Microsoft.VC80.CRT, но у меня ее нет вообще...

Рантайм для VC++ распространяется в виде отдельного пакета. Уже много раз обсуждалось - здесь это не в тему. Опиши последовательно твой процесс деплоймента smile Что и куда перенёс.

Кстати, некутешные проекты на VC++ работают?

Автор: just_geek 3.6.2008, 11:19
Цитата

CONFIG -= embeded_manifest_dll

Вообще-то это для плагинов, а не для твоего проекта. К примеру если ты используешь sqlite, то должен его перекомпилировать с этой опцией.

Цитата

добавил msvcr80.dll & msvcp80.dll правда в папке Visual C++ EE 2003 их не нашел, нашел в папке SDK, все равно не работает... Правда надо было еще скопировать папку  <Visual Studio Install Path>\VC\redist\<Architecture>\Microsoft.VC80.CRT, но у меня ее нет вообще...

Я так и не понял какая версия Visual C++ у тебя? если 2003, то он называется по другому - Visual C++ Toolkit 2003 (это бесплатный компилер, без IDE к тому же). Если такая версия, то искать нужно mvcr71.dll & msvcp71.dll.

Цитата

Рантайм для VC++ распространяется в виде отдельного пакета.

Не обязательно, можно из папки <Visual Studio Install Path>\VC\redist\<Architecture>\Microsoft.VCх0.CRT скопировать все файлы включая манифест, в папку с программой и все будет работать. Сам так делаю, и все прекрасно работает.

Автор: Любитель 3.6.2008, 12:07
Цитата(just_geek @  3.6.2008,  11:19 Найти цитируемый пост)
Не обязательно, можно из папки <Visual Studio Install Path>\VC\redist\<Architecture>\Microsoft.VCх0.CRT скопировать все файлы включая манифест, в папку с программой и все будет работать. Сам так делаю, и все прекрасно работает. 

Я знаю smile Я сказал про основной способ. В своё время в разделес по VC++ я писал ни раз о деплойменте приложений, написанных на VC++ (2005 и выше). А если у него 2003-я студия, то там манифесты не использовались - достаточно просто копирования длл-ок рантайма.

Автор: CuteBunny 3.6.2008, 13:47
VC++ 2005 Express Edition, ошибся smile , консольные приложения (типа #include <iostream> using namespace std; int main(int argc, char **argv){cout<<"Hello, world!\n"; return 0;}), некутишные работают, больше я ничего там не собирал, да и можно ли на укороченном?

В папку release с экзешником кидаю

QtCore4.dll, QtGui4.dll, QtSql4.dll (бд прога, sqlite движок), дальше, копирую из папки SDK, msvcr80.dll, msvcp80.dll, вот вроде и все...

в pro файле следующие строки:

QT += sql
CONFIG += release
CONFIG -= debug
CONFIG += console
CONFIG -= embeded_manifest_dll

и т.д.

qmake -o Makefile MyProject.pro

nmake

Автор: Любитель 3.6.2008, 14:05
Цитата(CuteBunny @  3.6.2008,  13:47 Найти цитируемый пост)
дальше, копирую из папки SDK, msvcr80.dll, msvcp80.dll, вот вроде и все...

Не всё. Про манифест рантайма забыл.

Автор: CuteBunny 3.6.2008, 17:15
манифест рантайма? у меня там лежит манифест от проги, вылез после nmake'a... оно? я нуб в этом пока что smile  

Автор: Любитель 3.6.2008, 17:50
Microsoft.VC80.CRT.manifest. Расположен в %VSDIR%\VC\redist\x86\Microsoft.VC80.CRT

Автор: CuteBunny 5.6.2008, 11:40
Поставил себе нормальный Visual Studio 2005 prof, пересобрал проект, добавил в папку release

msvcm80.dll
msvcp80.dll
msvcr80.dll
QtCore4.dll
QtGui4.dll
Microsoft.VC80.CRT

"Ошибка не отправлять отчет и т.д. и т.п."

Но потом взял один из примеров qt, sdi, также кинул в папку release'а все вышеперечисленное, и работает на другом компе, короче, проблема точно где-то в самой моей программе, точно не знаю...

Возможно, что памяти не хватает? В проге почти все объекты создавал динамически, машина на которой пытаюсь запустить свою тестовую прогу имеет памяти в 128 метров, стоит windows xp?

Еще раз попробую вариант с console'ю, чтобы найти причину...

Автор: CuteBunny 5.6.2008, 12:00
Теперь консоль выдала ошибку о том, что я пытаюсь задействовать сигнал у объекта, которым он не обладает smile , консоль начала выдавать сообщения, после того, как я в папке release убрал все внешние dll'ки, почему с dll'ками консоль ничего не выдает?

Автор: rainbow86 5.6.2008, 13:29
CuteBunny, попробуй http://www.dependencywalker.com/depends22_x86.zip на машине где не запускается. Прога исследует все зависимости, может поможет!

Автор: CuteBunny 5.6.2008, 13:41
Да я смотрел через dependency walker (QtCore4.dll, QtGui4.dll, QtSql4.dll, MSVCR80.dll и т.д.), вроде сейчас все должно заработать, но теперь не грузится sql driver...

ПРОЧИТАЛ ВЕТКУ ПРО симптом driver not loaded, в pro. файле указал, шоб 

CONFIG -= embed_manifest_dll

только вот вопрос, куда кидать сам драйвер sqlite'а? на C:/QT/plugins на машине без QT'а? прочитал в assistante про то, что можно как-то создавать
qt.conf файлы, как-то через него можно сделать прогу более удобной...

Кто создавал qt.conf'ы поделитесь опытом smile

Добавлено через 8 минут и 38 секунд
Все, точно, плагин qsqlite4.dll надо было кидать в ту же папку на машине без qt, где она лежит на машине, где есть qt и конечно не забыть про CONFIG -= embed_manifest_dll

Программа успешно загрузилась на другой машине без QT smile 

Но вопрос про qt.conf еще остается

Автор: Любитель 5.6.2008, 16:42
qt.conf кидается в папку с приложением (речь про винду). Это ини-файл, в секцию Paths кидаются настройки путей (те же Plugins).

Автор: CuteBunny 5.6.2008, 16:59
блин, достаточно было прочитать ассистанта, но все равно спасибо smile  smile  smile 
тема закрыта

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)