Windows и динамические библиотеки (QtCore4.dll,msvcr100.dll,..)

Такие файлы как например QtCore4.dll, QtNetwork4.dll являются неотъемлемой частью вашей программы , если вы не собираете проект статически.

При запуске Qt Creator добавляет путь к этим файлам в глобальную переменную PATH (в Windows). И если вы запускаете свою прогу из Qt Creator , то Qt Creator передает вашей проге свою среду исполнения (и там конечно есть PATH).

Но если вы запускаете свою программу (свой exe) уже самостоятельно (возможно уже на другом ПК), то как ваша программа найдет нужные ей QtCore4.dll, QtNetwork4.dll на другом ПК. Их там скорее всего вообще нет, или еще хуже другой ниже стоящей версии.

Короче надо тащить со своим exe-шником эти файлы.

Переходим к практике: добавляем по инструкции в файл pro нужные директивы.

win32{
    libstocopy.files = $$QMAKE_LIBDIR_QTQTCORE4.DLL 
        $$QMAKE_LIBDIR_QTQtNetwork4.DLL
}
win32 {
    CONFIG(debug, debug|release): OUTDIR = debug
    else: OUTDIR = release
}
libstocopy.path = $$OUT_PWD/$$OUTDIR
INSTALLS  = libstocopy

Жмякаем Запустить qmake

фотка 1

Очищаем все, пересобираем проект , но файлы QtNetwork4.dll и QtCore4.dll не появляются "хоть убей" в выходном каталоге release.

Консоль сборки показывает , что якобы все нормально:

фотка 2

И тут помогает такая логика - Запустить qmake : что он делает? - подготавливает файлы makefile, Makefile.Release , Makefile.Debug.

фотка 3

А если посмотреть Makefile.Release (на предмет где там появляется libstocopy) , то действительно там есть такая часть кода:

####### Install

install_libstocopy: first FORCE
	@$(CHK_DIR_EXISTS) c:$(INSTALL_ROOT)DEVELOPMENTDRIVERSQt-2018TCPsend-build-desktop-Qt_4_8_1_f
elease $(MKDIR) c:$(INSTALL_ROOT)DEVELOPMENTDRIVERSQt-2018TCPsend-build-desktop-Qt_4_8_1_f
elease 
	-$(INSTALL_FILE) c:QtSDK1.2.1DesktopQt4.8.1msvc2010libQTCORE4.DLL c:$(INSTALL_ROOT)DEVELOPMENTDRIVERSQt-2018TCPsend-build-desktop-Qt_4_8_1_f
elease
	-$(INSTALL_FILE) c:QtSDK1.2.1DesktopQt4.8.1msvc2010libQtNetwork4.DLL c:$(INSTALL_ROOT)DEVELOPMENTDRIVERSQt-2018TCPsend-build-desktop-Qt_4_8_1_f
elease


uninstall_libstocopy:  FORCE
	-$(DEL_FILE) c:$(INSTALL_ROOT)DEVELOPMENTDRIVERSQt-2018TCPsend-build-desktop-Qt_4_8_1_f
eleaseQTCORE4.DLL 
	 -$(DEL_FILE) c:$(INSTALL_ROOT)DEVELOPMENTDRIVERSQt-2018TCPsend-build-desktop-Qt_4_8_1_f
eleaseQtNetwork4.DLL
	-$(DEL_DIR) c:$(INSTALL_ROOT)DEVELOPMENTDRIVERSQt-2018TCPsend-build-desktop-Qt_4_8_1_f
elease 


install:  install_libstocopy  FORCE

uninstall: uninstall_libstocopy   FORCE

так вот надо еще явно указать выполнение этапа install в следующем месте :

фотка 4

И вуаля - QtNetwork4.dll и QtCore4.dll появляются в каталоге release.

фотка 5

На вашем ПК , если вы тут программируете на QT, скорее всего программа будет теперь запускаться нормально при щелчке мыши на ней а проводнике.

Но рано радоваться , на другом ПК скорее всего вы увидите такое :

фотка 6

Файл msvcp100.dll находится у нас в каталоге C:Program Files (x86)Microsoft Visual Studio 10.0VC redistx86Microsoft.VC100.CRT.

Понятно , компилируем мы чем? - компилятором MSVC2010 ,и теперь вам надо в каталог к своей программе кинуть еще msvcp100.dll. Хорошо , что еще сам компилятор не надо с собой тащить...

Также нужен будет msvcr100.dll из того же каталога C:Program Files (x86)Microsoft Visual Studio 10.0VC edistx86Microsoft.VC100.CRT.

И вот теперь ваша программа на чужом девственном ПК запуститься. Ура Товарищи!

Не уверен , но может еще потребоваться добавить в самое начало вашего кода такое :

    QStringList paths = QCoreApplication::libraryPaths();
    //paths.append(".");
    paths.append(QCoreApplication::applicationDirPath());
    QCoreApplication::setLibraryPaths(paths);
// Когда ваша программа запускается, то она добавляет к своей среде исполнения в переменную PATH каталог, в котором она сама находится.

Еще как вариант , чтобы не заморачиваться с msvcr100.dll и msvcp100.dll можно кинуть в каталог программы vcredist_x86.exe (Распространяемый пакет Microsoft Visual C 2010 (x86)), скачанный с сайта MicroSoft.