среда, 2 сентября 2015 г.

Деплой простого C++/Qt приложения с виджетами на Windows

Собирал QtCreator + MinGW. Приложение содержало пару кнопочек и таймер. Сразу было понятно, что нужны используемые модули Qt:
  1. Qt5Core.dll
  2. Qt5Gui.dll
  3. Qt5Widgets.dll
Винда шутку не оценила, порекомендовала поискать еще рантайм GCC и libstd++
  1. libgcc_s_dw2-1.dll
  2. libstdc++-6.dll
В ответ на это ругалось ошибкой пикрелейтед ("Ошибка при запуске приложений (0x000007b). Для выхода из приложения нажмите кнопку "ОК" "). Гугл посылал куда-то в сторону windeployqt.exe, который помог чуть меньше, чем никак.
Удалось обнаружить недостающую dll-ку следующим способом: взял в руки Process Explorer из sysinternals, нашел процесс программы, запущенной (успешно) из QtCreator, нажать Ctrl+D (посмотреть загруженные DLL для процесса), отсортировать по Path и найти библиотеки, относящиеся к "C:/Qt/5.5/...". Недостающим звеном оказалась библиотека libwinpthread-1.dll (для POSIX threads под MS Windows).
Итого список модулей дистрибутива брутто:
  1. %YOUR_APP_NAME%.exe
  2. Qt5Core.dll
  3. Qt5Gui.dll
  4. Qt5Widgets.dll
  5. libgcc_s_dw2-1.dll
  6. libstdc++-6.dll
  7. libwinpthread-1.dll

пятница, 3 апреля 2015 г.

Изменение размера памяти виртуальной машины VirtualBox

Маленький скрипт для изменения размера *.vdi-образа виртуальной машины в Oracle VirtualBox. Текст нужно скопировать в текстовый файл с расширением *.bat и запустить. Права администратора не требуются.

Прим.: Скрипт предполагает умолчательное состояние путей к VirtualBox, расположении проекта виртуальной машины и то, что пользователь не переименовывался.

@echo off
set VM_NAME=
set VM_HDD_NAME=
set NEW_SIZE=
set VDI_PATH=
set VBOX_PATH=

rem -------- [Configuration] --------------

set /p VM_NAME="Virtual machine name:"
set /p VM_HDD_NAME="Virtual machine storage device (HDD) name [as VM name]: "
set /p NEW_SIZE="Set new size in GB: "
set VDI_PATH=C:\Users\%USERNAME%\VirtualBox\ VMs\%VM_NAME%
set VBOX_PATH=C:\Program Files\Oracle\VirtualBox

rem -------- [/Configuration] -------------

if "%VM_HDD_NAME%"=="" set VM_HDD_NAME=%VM_NAME%
set /A NEW_SIZE=%NEW_SIZE%*1024

"%VBOX_PATH%\VBoxManage" modifyhd "%VDI_PATH%\%VM_HDD_NAME%.vdi" --resize %NEW_SIZE%
pause

Такую неособо нужную штуку бывает полезно написать, чтобы понять, насколько ужасна консоль в Windows =)

воскресенье, 4 января 2015 г.

Скрещивание Qt (+QtCtreator IDE) с компилятором MS Visual Studio 2012 (ver 11.0)

Ох, много седых волос прибавилось за этот долгий день. Итак, самым главным откровением оказалось то, что студия 2012 года является версией 11.0. Необходимо установить Windows SDK (советую отказаться от документации - сэкономит около 2,5Гб при установке с онлайновым инсталлятором). Далее необходимо установить переменные окружения. Пусть студия находится по адресу C:\Program Files (x86)\Microsoft Visual Studio 11.0, а Qt - C:\Qt\5.4

MSVS11ROOT="C:\Program Files (x86)\Microsoft Visual Studio 11.0"
INCLUDE="%MSVS11ROOT%\VC\include\;C:\Program Files (x86)\Windows Kits\8.0\Include\um"
LIB="%MSVS11ROOT%\VC\lib;C:\Program Files (x86)\Windows Kits\8.0\Lib\win8\um\x86;"
LIBPATH="%MSVS11ROOT%\VC\lib\"
QTDIR="C:\Qt\5.4"
QMAKESPEC="win32-msvc2012"
PATH="...;C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE;C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin;C:\Qt\Tools\mingw491_32\bin;C:\Qt\5.4\msvc2012_opengl\lib;C:\Program Files (x86)\Windows Kits\8.1\bin\x86"

Когда компилятор ругался крокозябрами на то, что не нашел тулы для сборки (всякие cl.exe, mt.exe), необходимо соответствующий путь добавлять в переменную Path. Ошибка с необнаруживаемым заголовочником stddef.h относится к переменной INCLUDE.

Переменные окружения можно делать и пользовательскими, главное - не забывать перезагружаться/перелогиниться в системе после каждого изменения в переменных!

вторник, 9 декабря 2014 г.

Подсветка синтаксиса программного кода в Blogger ( blogspot )

#include<iostream>

int main()
{
    std::cout << "Hello World!" << std::endl;
    std::cin.get();
    return 0;
}
Дошли руки разобраться с подсветкой синтаксиса для блога, сразу пилю заметку (в сети много копипасты, пусть будет альтернативное изложение).

вторник, 11 марта 2014 г.

Qt основы многопоточности

Правильная реализация многопоточности Qt

В старых учебниках по Qt (того же Шлее) указывается, что для создания потока, необходимо унаследоваться от класса QThread, перегрузив виртуальный метод void run(), в духе Java. Проблема в том, что с некоторого времени класс QThread перестал быть чисто виртуальным (абстрактным), что уже не требует реализации метода run() и какого-либо наследования. Специалисты и документация утверждают, что QThread является вполне себе интерфейсом к объекту потока, и что наследование от него обязательно приведет к беде при использовании сигналов и слотов базового класса.


четверг, 20 февраля 2014 г.

IBM Lotus Notes, проблема с запуском.



Патологически мне не везет на корпоративную почту. В этот раз я сижу в обнимку с и без того печальным IBM Lotus Notes.



Признаки



После запуска просит предъявить пароль. После ввода "моргает" главным окном и впадает в вечную загрузку под сплеш-скрин с зациклившимся прогрессбаром. На повторный запуск сразу - никакой реакции, в памяти висят 3-4 процесса. Если их убить, ситуация повторяется. Перезагрузка не помогает.


вторник, 11 февраля 2014 г.

Си и ООП

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