Как установить wxwidgets на windows

В продолжение поста (новости) wxWidgets. Мелочь, но приятно, ловите печеньку.

Картинка взята с ресурса: ru.wikipedia.org, автор: Bryan Petty.

Выдержка из Wiki: wxWidgets — это кросс-платформенная библиотека инструментов с открытым исходным кодом для разработки кроссплатформенных на уровне исходного кода приложений, в частности для построения графического интерфейса пользователя (GUI).

Библиотека имеет набор классов для работы с графическими изображениями, HTML, XML документами, архивами, файловыми системами, процессами, подсистемами печати, мультимедиа, сетями, классы для организации многопоточности, отладки, отправки дампов и множество других инструментов.

Внимание! Под катом трафик!

Тройку лет назад заинтересовался кросс-платформенным программированием с использованием выше озаглавленной библиотеки. Каждый раз при сборке этой библиотеки возникало куча проблем. Проблемы не были связанны с тем, что библиотека имела какие-то существенные баги, а были связаны с тем, что при использовании подобных инструментов требующих компиляции (сборки), необходимо внимательно относится к сопровождающей литературе.
Если говорить понятным языком, то необходимо внимательно читать мануалы, readme-файлы, FAQ и т.д…

Хотя статей по сборке и использованию wxWidgets достаточно в сети, все равно считаю нужным поделится своим опытом, постараюсь объяснить шаги, которые приводят к положительному результату, и описать что к чему, чтобы разработчики только начинающие использовать wxWidgets в своих проектах, меньше наступали на грабли, и сразу перешли к использованию всех функциональных возможностей этой библиотеки.
И так, поехали.
Сборку библиотеки будем производить в операционной системе Windows 7 Professional x32 SP1. Что касается других OS, то могу смело заявить, что сборка wxWidgets под Ubuntu Desktop 12.04, не вызывает особых сложностей, все прекрасно собирается. Для сборки под GNU/Linux, можно воспользоваться этим мануалом.

В качестве IDE (редактора кода и автоматизации сборки), будем использовать Code::Blocks. Думаю многие уже о нем слышали, поэтому не будем вдаваться в подробности. Упомяну лишь, что C::B – достаточно мощный инструмент для написания больших приложений, и напрямую «заточен» под использование библиотеки инструментов wxWidgets, т.к. сам собран с использованием этой библиотеки.

1) Установка компилятора, средств отладки и предварительная настройка:
Средства отладки (дебагер), обычно устанавливаются по умолчанию вместе с компилятором, в случае компиляторов GCC и некоторых других, — это файл со скромным названием GDB.

FAQ: Первые грабли с которыми сталкиваются начинающие разработчики, — это неверная установка используемого для сборки библиотеки компилятора. Большинство устанавливают MinGW вместо TDM-GCC, на котором собственно и ведется разработка wxWidgets под Windows.

Ссылка: TDM-GCC это альфа сборка новых релизов gcc собранных для mingw
текущий официальный выпуск mingw включает в себя gcc 3 и более новых версий gcc раньше разработчиками mingw не выкладывалось. Поэтому один из разработчиков стал собирать новые gcc и выкладывать пакеты предназначенные для замены gcc в установленном mingw. Сейчас gcc 4.5 есть и у mingw http://sourceforge.net/downloads/mingw/MinGW/BaseSystem/GCC/Version4/ хз чем они отличаются…

Стоить отметить, что при установке MinGW, библиотека может собраться, но с очень малой вероятностью, скорее всего в конце сборки, после многоминутного ожидания, вы получите сообщение об ошибке вроде этой:
if not exist ..\..\lib\gcc_lib\mswud mkdir ..\..\lib\gcc_lib\mswud
g++ -c -o gcc_mswud\monolib_treectrl.o -g -O0 -mthreads -DHAVE_W32API_H -D__WXMSW__ -D_UNICODE -I..\..\lib\gcc_lib\mswud -I..\..\include -W -Wall -DWXBUILDING -I..\..\src\tiff\libtiff -I..\..\src\jpeg -I..\..\src\png -I..\..\src\zlib -I..\..\src\regex -I..\..\src\expat\lib -I..\..\src\stc\scintilla\include -I..\..\src\stc\scintilla\lexlib -I..\..\src\stc\scintilla\src -D__WX__ -DSCI_LEXER -DLINK_LEXERS -DwxUSE_BASE=1 -Wno-ctor-dtor-privacy -MTgcc_mswud\monolib_treectrl.o -MFgcc_mswud\monolib_treectrl.o.d -MD -MP ../../src/msw/treectrl.cpp
makefile.gcc:9395: recipe for target 'gcc_mswud\monolib_treectrl.o' failed

Переходим на официальный сайт компилятора TDM-GCC в раздел загрузки, скачиваем и устанавливаем последнюю стабильною версию соответствующую разрядности нашей операционной системы (x32 или x64). В нашем случае это: tdm-gcc-4.8.1-3.exe.
Далее стандартная процедура: запускаем мастер установки, и устанавливаем компилятор с опциями по умолчанию.

Совет: При установке каких либо программ, библиотек, распаковки пакетов и т.д., лучше всего использовать, в мастере установки программ, настройки (опции) по умолчанию. Поверьте, это вызовет намного меньше забот, и меньше плясок с бубном вокруг библиотек и программ. Это касается, библиотек, программ, и всевозможных компиляторов.

Настройка компилятора заключается в том, что необходимо добавить в системную переменную окружения Path, путь к бинарным сборкам компилятора, если этого не сделал мастер установки по умолчанию. Обычно это: C:\TDM-GCC-32\bin (если директорией установки (распаковки) был выбран корневой каталог диска C:\);

Проверка: Проверка работоспособности будет заключаться в следующих действиях: запускаем командную строку (CMD), и просто выполняем команду: mingw32-make -v соответственно видим версию сборки make — компоновщика. Должно появится чтото вроде этого:

2) Загрузка, распаковка и сборка библиотеки wxWidgets:
Переходим на официальный сайт библиотеки wxWidgets в раздел загрузки, скачиваем и распаковываем последнюю стабильною версию библиотеки для OS Windows. В нашем случае это: wxMSW-Setup-3.0.0.exe (Windows Installer).
Далее стандартная процедура: запускаем мастер распаковки, и распаковываем библиотеку с опциями по умолчанию.
Предварительная настройка компилятора заключается в том, что необходимо добавить системную переменную окружения WXWIN, которая будет содержать путь к корневому каталогу библиотеки. Обычно это: C:\wxWidgets-3.0.0 (если директорией установки (распаковки) был выбран корневой каталог диска C:\);

Собственно приступаем к сборке. Запускаем командную строку (CMD), и выполняем по порядку следующие команды (дожидаясь завершение выполнения каждой):

cd %WXWIN%\build\msw
mingw32-make -f makefile.gcc clean
mingw32-make -f makefile.gcc BUILD=debug SHARED=0 MONOLITHIC=0 UNICODE=1 WXUNIV=0
mingw32-make -f makefile.gcc BUILD=release SHARED=0 MONOLITHIC=0 UNICODE=1 WXUNIV=0

Обычно количество опций сборки не превышает указанных.
Разберем назначение указанных опций:

BUILD — сборка библиотеки в режиме: debug (отладки) или release (релизной версии приложения);
SHARED — тип сборки библиотеки: 0 — static статическая сборка, 1 — dynamic динамическая сборка соответственно;
MONOLITHIC — собрать все библиотеки в «одну»: 1 — да, 0 — нет, удобно на первых этапах знакомства с библиотекой;
UNICODE — Поддержка unicode: 1 — да, 0 -нет;
WXUNIV — собрать элементы интерфейса общими для любой OS: 1 — да, 0 — нет. (или сборка собственных элементов управления для операционных систем где эти элементы отсутствуют).

Процесс сборки будет похож на этот скриншот:

3) Загрузка, установка и настройка IDE Code::Blocks:
Переходим на официальный сайт программы Code::Blocks в раздел загрузки, скачиваем и устанавливаем последний стабильный бинарный релиз программы для OS Windows. В нашем случае это: codeblocks-13.12-setup.exe. Необходимо загружать версию без компилятора, т.к. компилятор мы установили ранее, и скорее всего он «свежее» компилятора который идет в поставке с C::B.

FAQ, Note: The codeblocks-13.12mingw-setup.exe file includes the GCC compiler and GDB debugger from TDM-GCC (version 4.7.1, 32 bit). The codeblocks-13.12mingw-setup-TDM-GCC-481.exe file includes the TDM-GCC compiler, version 4.8.1, 32 bit. While v4.7.1 is rock-solid (we use it to compile C::B), v4.8.1 is provided for convenience, there are some known bugs with this version related to the compilation of Code::Blocks itself.

IF UNSURE, USE «codeblocks-13.12mingw-setup.exe»!

Примечание: Общее время компиляции занимает в среднем порядка 30-40 минут. Да-да, библиотека не такая уж и маленькая, имеет кучу классов.

Далее стандартная процедура, запускаем мастер установки, и устанавливаем программу с опциями по умолчанию.

Настройки среды разработки сводятся к настройке компилятора по умолчанию. Обычно при первом запуске C::B сам выдаст диалог для выбора основного компилятора из всех найденных (выбираем TDM-GCC), но иногда этот диалог может не появлятся. Тогда запускаем C::B и переходим по пунктам главного меню к настройкам компилятора: Settings-->Compiler Вкладка: Toolchain executables и по анологии со скриншотом настраиваем C::B.

Проверка: Для проверки работоспособности среды разработки и проверки правильной настройки компиляторов, необходимо в C::B создать тестовый консольный проект, следующим образом:
1) Запускаем C::B (если он не запушен ранее);
2) Переходим по пунктам меню: File-->New-->Project в открывшимся диалоге (Project) выбираем Console application и нажимаем кнопку [Go];
3) Следуем подсказкам диалога предварительной настройки проекта, задаем параметры проекта (имя, расположение и т.д), нажимаем кнопку [Next] затем [Finish];
Открылся редактор кода проекта. Если нет то Выбираем пункты главного меню: View-->Manager, View-->Toolbars-->Compiler. Открываем исходный код в дереве менеджера main.cpp,

должен быть такой код:

если необходимо редактируем.

4) Выбираем пункт главного меню: Build-->Build and Run, и наблюдаем наше скомпилированное приложение:

4) Создание тестового проекта с использованием wxWidgets:
Запускаем C::B если он не был запущен, и переходим по пунктам главного меню: File-->New-->Projects из всех типов создаваемого проекта, выбираем wxWidgets project, нажимаем кнопку [Go].

В появившимся окне предварительной настройки проекта, следуем подсказкам, а именно:
1) Нажимаем кнопку [Next];

2) Выбираем тип используемой библиотеки wxWidgets 3.0.x, нажимаем кнопку [Next];

3) Задаем параметры проекта имя, путь к исходникам и т.д., нажимаем кнопку [Next];

4) Задаем авторов проекта (это можно пропустить), нажимаем кнопку [Next];
5) Выбираем дизайнер форм wxSmith (т.к. wxFormBuilder — у нас предварительно не установлен), также выбираем тип создаваемого приложения Frame Based, нажимаем кнопку [Next];

6) Очень внимательно отнесемся к локальной переменной, и вместо $(wx) зададим $(WXWIN), нажимаем кнопку [Next];

7) выбираем компилятор (обычно по умолчанию) нажимаем кнопку [Next];

8) в случае нашей сборки (статической-не монолитной), параметры следующего окна должны быть такими:

нажимаем кнопку [Next] и соглашаемся с диалогами.
9) Выбираем необходимые нам классы с которыми мы хотим работать.
В зависимости от способа сборки, статическая-динамическая, монолитная и ли нет следующего окна может не быть.

нажимаем кнопку [Finish];

Глобальные переменные проекта должны быть настроены следующим образом (Settings-->Global variables):

Настройки проекта должны выглядеть примерно так (Project-->Build options):
Окно Project build options (wx_test) [Вкладка Compiler settings - Other options]:

-pipe
-mthreads
-Winvalid-pch
-include wx_pch.h

Окно Project build options (wx_test) [Вкладка Compiler settings - Other options]:

__GNUWIN32__
__WXMSW__
wxUSE_UNICODE
WX_PRECOMP

Окно Project build options (wx_test) [Вкладка Linker settings]:

Окно Project build options (wx_test) [Вкладки Search directories - Compiler и Resource compiler]:

$(WXWIN)\include

Окно Project build options (Debug) [Вкладка Linker settings]:

Окно Project build options (Debug) [Вкладки Search directories - Compiler и Resource compiler]:

$(WXWIN)\lib\gcc_lib\mswud

Окно Project build options (Debug) [Вкладки Search directories - Linker]:

$(WXWIN)\lib\gcc_lib

Окно Project build options (Release) [Вкладка Linker settings]:

Окно Project build options (Release) [Вкладки Search directories - Compiler и Resource compiler]:

$(WXWIN)\lib\gcc_lib\mswu

Окно Project build options (Release) [Вкладки Search directories - Linker]:

$(WXWIN)\lib\gcc_lib

Далее сохраняем настройки путем нажатия кнопки [Ок] в форме настройки сборки проекта Project build options.

Скомпилируем (собирем) наше приложение (Build --> Build and run):

FAQ

FAQ:

Вопрос/Проблема:
Set system path!
Ответ/Решение:
set PATH (WXWIN):
C:\wxWidgets-2.9.4

Вопрос/Проблема:
if not exist gcc_mswud mkdir gcc_mswud
process_begin: CreateProcess(NULL, -c «if not exist gcc_mswud mkdir gcc_mswud», …) failed.
make (e=2): =х єфрхЄё эрщЄш єърчрээvщ Їрщы.
mingw32-make: [gcc_mswud] Error 2 (ignored)
if not exist ..\..\lib\gcc_lib mkdir ..\..\lib\gcc_lib
process_begin: CreateProcess(NULL, -c «if not exist ..\..\lib\gcc_lib mkdir ..\..\lib\gcc_
lib», …) failed.
make (e=2): =х єфрхЄё эрщЄш єърчрээvщ Їрщы.
mingw32-make: *** [..\..\lib\gcc_lib] Error 2
Ответ/Решение:
Run to cmd: set PATH=c:\mingw\bin

Вопрос/Проблема:
CodeBlocks wxWidgets’ location:
Ответ/Решение:
$(#wx) to $(WXWIN)

Вопрос/Проблема:
Global Variable Edition
Settings -> Compiler and Debugger -> Compiler Settings tab -> Compiler Options
Ответ/Решение:
base: C:\wxWidgets-2.9.4
include: C:\wxWidgets-2.9.4\include
lib: C:\wxWidgets-2.9.4\lib
cflags: `wx-config —cflags`
lflags: `wx-config —libs`
Other options:
`wx-config —cxxflags`
`wx-config —cflags`
`wx-config —libs`

что касается путей. вообще, если ты создашь wxWidgets проект в Code::Blocks, ты увидишь, что в настройках он вместо перечисления хедеров и библиотек указывает команды:
`wx-config —cflags` — в настройках компилятора
`wx-config —libs` — в настройках линкера
так вот: wx-config — это скрипт. если ты наберёшь эти команды в обычной консоли, то увидишь, что они генерируют целую последовательность флагов и файлов. у wx-config есть хэлп: wx-config —help. там описаны все вариации вызова этого скрипта. обрати внимание на опцию static.

На ошибки рода C:\wxWidgets-3.0.0\include\wx\platform.h|189|fatal error: wx/setup.h: No such file or directory|
Решение такое:
Projects —> Build options…
Debug (Search directories)
$(WXWIN)\lib\gcc_lib\mswud <—> $(WXWIN)\lib\gcc_dll\mswud

Бывают и неприятности. Например линовка может выдавать следующую ошибку:

rem gcc_mswudll\monodll_xh_combo.o: file not recognized: Memory exhausted
rem collect2.exe: error: ld returned 1 exit status
rem mingw32-make.exe: *** [..\..\lib\gcc_dll\wxmsw28u_gcc.dll] Error 1

Проявляется на некоторых 32 битных платформах при компоновке монолитной динамической библиотеки из-за нехватки памяти. Из-за того, что линковщик собранный для x86 архитектуры, не может использовать адреса выше 2Гб, даже на x86_64 архитектуре. Поэтому смена компилятора обычно не помогает, перепробованы MinGW4.4.1TDM, всё семейство MinGW4.6.x, а также MinGW4.7.0, хотя в сети есть информация, что собирается под TDM-GCC 4.5.2 sjlj.

Для компиляции в этом случае необходимо указать опцию компилятора -fno-keep-inline-dllexport:

mingw32-make -f makefile.gcc CXXFLAGS=»-fno-keep-inline-dllexport» BUILD=release SHARED=1 MONOLITHIC=1 UNICODE=1

Ещё можно использовать опцию —large-address-aware для линковщика(можно и для компилятора), но при этом надо настраивать ОС.

Также обойти проблему можно не используя монолитную сборку, или отказавшись от создания динамических библиотек для монолитной сборки, статические собираются без этой ошибки.

Upd:
Ошибки рода: This file requires compiler and library support for the ISO C++
2011 standart. This support is currently experimental, and the —std=c++11 or -std=gnu++11 compiler options.
This file requires compiler and library support for the…

Решаются явным указанием стандарта при сборке библиотеки (добавление опции):
CXXFLAGS=»-std=gnu++11″

Upd1: вероятно в последних релизах MinGW баги пофиксили, теперь можно смело собирать при помощи указанного компилятора, соблюдая те же (описанные) правила.

Upd2: при попытке собрать один из проектов в паке samples, может возникнуть следующая ошибка: «if not exist gcc_mswu mkdir gcc_mswu
process_begin: CreateProcess(NULL, -c „if not exist gcc_mswu mkdir gcc_mswu“, …) failed.» Фиксится путем добавления некоторых опций в запрос компилятора… «mingw32-make SHELL=CMD.exe -j4 -f makefile.gcc BUILD=release UNICODE=1 SHARED=0»

p/s.
Пост ориентирован прежде всего на начинающую аудиторию программистов, и не в коем случае не претендует на истину в последней инстанции.
В следующих постах опишу как «правильно» собрать библиотеку компьютерного зрения OpenCV.

Спасибо за внимание.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Как Вам пост?

70.56% Отличный туториал, давай еще!127

17.22% Давай по новой Миша, все фигня!31

12.22% Полно уже, ненужно это здесь.22

Проголосовали 180 пользователей. Воздержались 86 пользователей.

Материал из Викиучебника — открытых книг для открытого мира

Краткий справочник новичка по настройке wxWidgets с Code::Blocks в Windows [1]
Поддерживаемые компиляторы: MinGW или MSVC

Важные требования:

  • Последняя версия Code::Blocks — необходимо успешно установить и запустить последнюю версию Code::Blocks отсюда: cтраница загрузки Code::Blocks
  • Компилятор для Windows — необходимо правильно установить либо
    • MinGW/GCC — бесплатный компилятор, или
    • Microsoft Visual C++ Express бесплатно, но также требуется установка Windows SDK.

При загрузке официального релиза Code::Blocks, есть возможность загрузки пакета, который включает в себя полный набор инструментов MinGW/GCC.

  • Путь к файлам надлежащим образом определен — Убедитесь, что папка, содержащая исполняемые файлы компилятора (обычно C:\Program Files\CodeBlocks\bin, или C:\MinGW32\bin) добавлена в вашу переменную среды Windows PATH.

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

Рекомендованная к использованию версия wxWidgets 2.8.12. Нажмите сюда, чтобы скачать исходные коды wxWidgets 2.8.12 для Windows (wxMSW-2.8.12-Setup.exe; 12.2 MB). Можно также зайти на страницу загрузки wxWidgets чтобы проверить доступность новой стабильной версии. Настоятельно рекомендуется установить исходные коды wxWidgets с путем без пробелов. Требуется выбор тома (диска) с минимум 300 МБ свободного пространства.

  • Откройте окно командной строки для сборки. Если вы используете MinGW/GCC, проще будет воспользоваться стандартной командной оболочкой Windows (откройте меню «Пуск», нажмите кнопку «Выполнить…», введите «cmd» и нажмите OK). Если в меню «Пуск» нет кнопки «Выполнить…», то ее можно отобразить нажав правой кнопкой мыши кнопку «Пуск», далее выбираем пункт «Свойства», далее вкладка «Меню Пуск», кнопка «Настроить», поставить флажок у «Команда Выполнить», нажать кнопку «ОК». Если вы используете MSVC, следует использовать специальную командную оболочку, которая устанавливает правильные переменные среды. (Поищите в меню запуска Visual Studio пункт «Visual Studio 20XX Command Prompt» — это ярлык запуск оболочки с установленными переменными среды). Если вы используете версию MSVC, в которой необходимо скачать Platform SDK отдельно, убедитесь, что командная среда включает инструмент Platform SDK и пути к нему, а также стандартный компилятор с путями.
  • Перейдите в каталог сборки wxWidgets (<wxWidgets> в тексте далее — реальный путь распаковки его исходных кодов, например C:\wxWidgets-2.8.12):
cd /D <wxWidgets>\build\msw 

Примечание: /D флаг после cd может быть опущен из команды; просто это позволяет командной строке при необходимости изменить диски.

  • Выполните команду сборки. Рекомендованная команда для MinGW/GCC:
mingw32-make -f makefile.gcc BUILD=release SHARED=1 MONOLITHIC=1 UNICODE=1 CXXFLAGS=-fno-keep-inline-dllexport
  • Рекомендованная команда для MSVC:
nmake -f makefile.vc BUILD=release SHARED=1 MONOLITHIC=1 UNICODE=1
  • Этот этап может занять длительное время ; сборка длится порядка 30 минут на быстрых компьютерах, а на медленных может занимать несколько часов.
  • Если используются более поздние версии GCC, во время сборки будет отображаться множество предупреждений. Это обстоятельство может заметно замедлить процесс сборки; можно перенаправить предупреждения в текстовый файл, добавив в команду сборки «2>errlog.txt» или подавить их полностью путем добавления «2>nul».

С последними версиями GCC (не с MSVC) необходим параметр «CXXFLAGS =-fno-keep-inline-dllexport» для предотвращения проблем с использованием памяти при выполнении финального шага сборки в монолитную DLL.

В разделе ниже под названием «Пояснение по опциям сборки wxWidgets» объясняется подробная информация о значении различных вариантов сборки: BUILD, SHARED, MONOLITHIC и UNICODE. Эти опции имеют критически важное значение, поскольку они определяют основу среды разработки wxWidgets используемой в дальнейшем. А именно, требуется дублировать их при запуске мастера создания проекта Code::Blocks’ wxWidgets.

  • В стартовой странице Code::Block выберите «Create a new project»; или, откройте меню «File», выберите «New» и нажмите «Project…»
  • Выберите «wxWidgets project»
  1. Первая страница — это вступление, которое можно пропустить в будущем.
  2. Выберите версию wxWidgets которая нужна для работы. Если вы придерживались инструкции выше, нужно выбрать «wxWidgets 2.8.x».
  3. Задайте название и расположение проекта.
  4. Введите данные автора (не обязательно).
  5. Выберите опции автоматической генерации кода и файлов проекта.
  6. Выберите расположение wxWidgets. Крайне рекомендуется использовать глобальную переменную, для этого введите «$(#wx)» (без кавычек). Если прежде эта глобальная переменная не была определена, появится диалоговое окно глобальных переменных; в качестве базового пути выберите ваше местоположение установки wxWidgets. Остальные пути заполнять не требуется.
  7. Задайте опции отладочной (debug) и/или конечной (release) конфигураций проекта. Рекомендуется наличие хотя бы отладочной конфигурации.
  8. Выберите опции сборки wxWidgets. Далее следует выставить значения опций «wxWidgets Library Settings» в строгом соответствии с опциями сборки wxWidgets о которых говорилось выше. Другие настройки на этой странице, не связанные с параметрами сборки проекта wxWidgets — можно использовать их или не использовать, по своему предпочтению. Для того, чтобы избежать использования отладочной сборки wxWidgets (как рекомендовано), необходимо выбрать «Настроить Расширенные параметры» и затем оставить «Use __WXDEBUG__ and Debug wxWidgets lib» снятым на следующей странице.
  9. При необходимости выберите дополнительные библиотеки. Вы не должны выбирать любую из них для обычного использования.

Нажмите «Сборка и запуск» (F9) чтобы проверить сборку и запуск приложения. Если все пойдет хорошо, ваше приложение wxWidgets должно появиться на экране.

Что означают опции BUILD, SHARED, MONOLITHIC, and UNICODE?

BUILD задает какую версию wxWidgets, отладочную (BUILD=debug) или конечную (BUILD=release), следует собрать. В подавляющем большинстве случаев нужна только конечная версия выпуска wxWidgets, так как отладка самого wxWidgets не потребуется. Вполне можно создавать отладочные сборки своих собственных программ, которые ссылаются на конечную сборку wxWidgets.

  • Отладочная (debug) сборка wxWidgets ‘ создает библиотеки с суффиксом «d», например «libwxmsw28d.a»/»wxmsw28d_gcc_custom.dll».
  • Отладочная (debug) сборка wxWidgets создает папку «mswd» или «mswud» в папке вывода библиотеки wxWidgets.
  • Конечная (release) сборка wxWidgets ‘ создает библиотеки без суффикса «d», например, «libwxmsw28.a»/»wxmsw28_gcc_custom.dll».
  • Конечная (release) сборка wxWidgets ‘ создает папку «msw» или «mswu» в папке вывода библиотеки wxWidgets.

SHARED задает какую версию wxWidgets, динамически связываемую DLL (SHARED=1) или статически связанную static (SHARED=0), следует собрать. При сборке DLL версии компиляция происходит быстрее и размер исполняемого файла меньше. Общий размер одного исполняемого файла плюс библиотеки DLL wxWidgets больше, но одну и ту же библиотеку DLL могут использовать несколько исполняемых файлов и в этом случае получается экономия места на диске.

  • Динамически связываемая DLL сборка wxWidgets создает библиотеки импорта (например, libwxmsw28.a) и библиотеки DLL (например, wxmsw28_gcc_custom.dll). При распространении своей программы библиотеку DLL следует включать в дистрибутив.
  • Статически связываемая static сборка wxWidgets создает только статические библиотеки (например, libwxmsw28.a), и в дальнейшем не потребуется распространять библиотеки DLL wxWidgets вместе с созданным приложением.

MONOLITHIC задает какую библиотеку, единую (MONOLITHIC=1) или многокомпонентную (MONOLITHIC=0) следует собрать. При монолитной сборке дальнейшие установка и разработка проекта выполняются намного проще, т.к. если используется DLL тип сборки библиотеки, то для распространения потребуется только одна библиотека DLL. При немонолитной (multilib) сборке, собираются несколько различных библиотек, и можно избежать связывания со всей базой кода wxWidgets тех программ, которые не нуждаются в ней. Нужно быть полностью уверенным в своих действиях выбирая правильный компонент библиотеки.

  • Монолитная monolithic сборка wxWidgets создает единую библиотеку импорта wxWidgets (такую как libwxmsw28u.a) и единую DLL (такую как wxmsw28_gcc_custom.dll).
  • Немонолитная multilib сборка wxWidgets создает несколько библиотек импорта (libwxbase28u.a, etc.) и несколько DLL.
  • Дополнительные статические библиотеки всегда создаются с любой сборкой wxWidgets (libwxexpat.a, libwxjpeg.a, и т.д.). Эти библиотеки обычно не требуются при использовании DLL сборки wxWidgets, но они нужны при использовании статической сборки.

UNICODE задает использование в библиотеке wxWidgets и в создаваемой программе поддержки символов Юникода. Эта возможность используется в большинстве программ для ОС Windows 2000 и более поздних версий. Более ранние версии Windows не имели необходимой поддержки Юникода. Вы всегда должны использовать макросы _(«string») и _T(«string») wxWidget для обеспечения того, чтобы жестко закодированные строки были правильного типа.

  • Юникод сборка wxWidgets (UNICODE=1) создает библиотеки с суффиксом «u», например, «libwxmsw28u.a»/»wxmsw28u_gcc_custom.dll».
  • Юникод сборка wxWidgets создает папку «mswu» или «mswud» в папке вывода библиотеки wxWidgets.
  • ANSI сборка wxWidgets (UNICODE=0) создает библиотеки без суффикса «u», например, «libwxmsw28.a»/»wxmsw28_gcc_custom.dll».
  • ANSI сборка wxWidgets создает папку «msw» или «mswd» в папке вывода библиотеки wxWidgets.
  • Уроки wxSmith
  • Уроки wxSmith: Hello world
  • WxWidgets Hello World в Visual C++ и wxFormBuilder
  1. Code::Blocks wiki: WxWindowsQuickRef

Материал из Wiki.crossplatform.ru

Перейти к: навигация, поиск

[править] Подготовка

Заходим на сайт wxWidgets и на странице загрузок скачиваем wxMSW (скачать wxMSW-2.8.8 )

[править] Установка

Устанавливаем wxMSW в некий каталог, который далее будем называть %wxWidgetsDir%

[править] Настройка

1. Запускаем Visual Studio

2. Выбираем меню File->Open->Project/Solution…, заходим в каталог %wxWidgetsDir%\build\msw и открываем файл wx.dsw.

3. В появившемся сообщении жмём Yes To All

4. В режиме Debug делаем Build Solution(F7)(собираем Debug версию)

5. переключаемся в Release и снова делаем Build Solution(F7)(собираем Realese версию)

6. Тестируем всё ли прошло хорошо: выбираем меню File->Open->Project/Solution…, заходим в каталог %wxWidgetsDir%\samples и открываем файл samples.dsw. В появившемся сообщении жмём Yes To All. Все остальные сообщения жмём Ok.
7. Теперь можно попробовать собрать, что-нибудь из появившегося списка, например «minimal». Если запустилось значит всё ok.

8. Перед тем, как создавать свой проект нужно указать пути к заголовочным файлам и библиотекам: выбираем меню Tools->Options… затем Projects and Solutions->VC++ Directories.

Указываем путь к заголовочным файлам:

%wxWidgetsDir%\include

%wxWidgetsDir%\include\msvc

и библиотекам:

%wxWidgetsDir%\lib\vc_lib.

9. Теперь можно попробовать создать свой проект: выбираем меню File->New->Project… и создаём пустой проект(Empty Project).

10. Добавляем в проект исходный файл и пишем минимальную wxWidgets программу. Пытаемся собрать(F7) и… получаем кучу ошибок  :)

11. Чтобы исправить это выбираем меню Project-><имя_проекта> Properties… затем Configuration

Properties->Linker->Input.

Теперь графу Additional Dependencies заполняем следующим содержимым:

rpcrt4.lib

comctl32.lib

Это надо делать каждый раз при создании нового проекта, или же использовать Property Sheet файл. (об этом можно посмотреть здесь)

Вот собственно и всё.

Обсуждение

Provide feedback

Saved searches

Use saved searches to filter your results more quickly

Sign up

Appearance settings

OVERVIEW

wxWidgets is primarily something which is used under Linux and *nix platforms and is definitely not the first choice of a UI framework for C++ when it comes to Windows. Visual Studio offers several options in that department – WinForms, WPF, Silverlight, Razor, Blazor etc.. And with the advent of .NET Core , you can create cross-platform apps using native libraries. Anyway, wxWidgets can still be used on Windows and here we see how to set it up for use under Windows 10.

I have avoided using any Microsoft tools and IDEs like Visual Studio or Visual Code. This is meant to be a bare bones environment which you can use from the command line.

SETUP MSYS2

The objective is to use Mingw64 as the C++ compiler to use for compiling wxWidgets itself and then building applications using wxWidgets. We can directly go to the MingW site and download the binaries and set them up, but it is quite error prone and can take a good amount of back and forth till you get it right.

A far easier and better option is to use MSYS2 to setup the MingW compiler. It takes care of all the headaches for you and is a life-saver. MingW not only installs MingW but all other possible C++ compilers like CLang and CygWin.

  • Go to https://www.msys2.org/ and download the installer exe file.
  • After downloading, run the installer.
  • Select the path where it should be installed: eg.d:\msys64 and click Next
  • Set a Start Menu shortcut name and click Next
  • The installation will start
  • Click Next and then click Finish
  • At this point , the command console of MSYS2 will open up
  • Update the package database by typing pacman -Syu and pressing Enter

The command window now closes. To complete the process, we need to run MSYS2 from the Start Menu

  • Go to Start->MSYS2 MSYS
  • In the command window type pacman -Su and press Enter

The next step is to install MingW64 toolset,

  • Use the command pacman -S –needed base-devel mingw-w64-x86_64-toolchain and press Enter
  • For Enter a Selection choose default=all and press Enter
  • For the next option Enter a Selection choose default=all and press Enter

Press Enter to start the installation of the required files

Once the process finishes, installation of MSYS2 is complete.

SETTING UP WXWIDGETS

We will download and compile the wxWidgets library .

  • Go to http://wxwidgets.org/downloads/ and click on the Windows Zip link under Source Code. This will download the windows source for wxWidgets
  • Create a folder where the file will be unzipped eg. d:\wxWidgets and unzip the contents into that folder.
  • We will now use the MSYS2 console to build the library
  • Go to Start->MSYS2 MinGW x64
  • In the MSYS2 console go to the folder where the wxWidgets source has been unzipped. To change the drive use cd /<drive>/ eg. cd /d/
  • To see the current working directory use the pwd command.
  • Assuming the folder is d:\wxWidgets, once we are in drive d. do cd wxWidgets
  • Type dir to see the contents of the directory
  • To create the static (non-shared) debug version do the following commands
  • mkdir build-debug
  • cd build-debug
  • ../configure –disable-shared –enable-debug
  • This will take some time to configure the files

  • Once the configuration process is complete, we build the library by typing make

BUILDING A SAMPLE APPLICATION

We will now create a very basic C++ application using wxWidgets and then build an executable. Create a folder where your source files will go eg. d:\projects\wxWidgets. Create the following file called simplewindow.cpp in a text editor:

// For compilers that support precompilation, includes "wx/wx.h".
#include "wx/wxprec.h"
// for all others, include the necessary headers (this file is usually all you
// need because it includes almost all "standard" wxWidgets headers)
#ifndef WX_PRECOMP
    #include "wx/wx.h"
#endif
class MyFrame : public wxFrame
{
public:
    MyFrame()
        : wxFrame(NULL, wxID_ANY, _("Test"))
    {}
};
class MyApp : public wxApp
{
public:
    virtual bool OnInit() override
    {
        myFrame.Show();
        return true;
    }
private:
    MyFrame myFrame;
};
IMPLEMENT_APP(MyApp)

What the above code does is show a simple resizable window and nothing else. We need to copy the generated files and folders from the d:\wxWidgets folder first.

From the build-debug folder copy the lib folder to the application folder

Next copy the includes folder to the application folder.

Now you should have two subfolders include and lib in your application folder.

The makefile used to create the executable is given below. There are a lot of options present there. We have taken a makefile from one of the sample applications which are part of the wxWidgets package and changed it to suit our needs. Make sure that the paths specified in the makefile are matching yours. The file name for makefile is makefile

appname=simplewindow
prefix = /mingw64
exec_prefix = ${prefix}
datarootdir = ${prefix}/share
INSTALL = /usr/bin/install -c
EXEEXT = .exe
WINDRES = windres
NM = nm
BK_DEPS = /d/wxWidgets/build-debug/bk-deps
srcdir = .
top_srcdir = .
LIBS = -lz -lrpcrt4 -loleaut32 -lole32 -luuid -llzma -luxtheme -lwinspool -lwinmm -lshell32 -lshlwapi -lcomctl32 -lcomdlg32 -ladvapi32 -lversion -lwsock32 -lgdi32 -loleacc -lwinhttp
LDFLAGS_GUI = -mwindows
CXX = g++
CXXFLAGS = 
CPPFLAGS = 
LDFLAGS = 
USE_DPI_AWARE_MANIFEST = 2
WX_LIB_FLAVOUR = 
TOOLKIT = MSW
TOOLKIT_LOWERCASE = msw
TOOLKIT_VERSION = 
TOOLCHAIN_FULLNAME = msw-unicode-static-3.1
EXTRALIBS =    -lz -lrpcrt4 -loleaut32 -lole32 -luuid -llzma -luxtheme -lwinspool -lwinmm -lshell32 -lshlwapi -lcomctl32 -lcomdlg32 -ladvapi32 -lversion -lwsock32 -lgdi32 -loleacc -lwinhttp 
EXTRALIBS_XML =  -lexpat
EXTRALIBS_GUI = -llzma
WX_CPPFLAGS = -I${wx_top_builddir}/lib/wx/include/msw-unicode-static-3.1 -I${top_srcdir}/include -D_FILE_OFFSET_BITS=64 
WX_CXXFLAGS = -Wall -Wundef -Wunused-parameter -Wno-ctor-dtor-privacy -Woverloaded-virtual -g -O0   
WX_LDFLAGS =  
HOST_SUFFIX = 
SAMPLES_RPATH_FLAG = 
SAMPLES_CXXFLAGS =  
wx_top_builddir = D:/wxWidgets/build-debug
### Variables: ###
DESTDIR = 
WX_RELEASE = 3.1
WX_VERSION = $(WX_RELEASE).5
LIBDIRNAME = $(wx_top_builddir)/lib
MAINAPP_CXXFLAGS = $(WX_CPPFLAGS) -D__WX$(TOOLKIT)__ $(__WXUNIV_DEFINE_p) \
	$(__DEBUG_DEFINE_p) $(__EXCEPTIONS_DEFINE_p) $(__RTTI_DEFINE_p) \
	$(__THREAD_DEFINE_p) -I$(srcdir) $(__DLLFLAG_p) -I$(srcdir). \
	$(WX_CXXFLAGS) $(SAMPLES_CXXFLAGS) $(CPPFLAGS) $(CXXFLAGS)
MAINAPP_OBJECTS =  \
	$(__MAINAPP___win32rc) \
	MAINAPP_main.o
### Conditionally set variables: ###
#CXXC = $(CXX)
CXXC = $(BK_DEPS) $(CXX)
#PORTNAME = base
PORTNAME = $(TOOLKIT_LOWERCASE)$(TOOLKIT_VERSION)
#WXBASEPORT = _carbon
#WXDEBUGFLAG = d
WXUNICODEFLAG = u
#WXUNIVNAME = univ
EXTRALIBS_FOR_BASE = $(EXTRALIBS)
#EXTRALIBS_FOR_BASE = $(EXTRALIBS) \
#	$(EXTRALIBS_XML) $(EXTRALIBS_GUI)
EXTRALIBS_FOR_GUI = $(EXTRALIBS_GUI)
#EXTRALIBS_FOR_GUI = 
#__WXUNIV_DEFINE_p = -D__WXUNIVERSAL__
#__WXUNIV_DEFINE_p_1 = --define __WXUNIVERSAL__
#__DEBUG_DEFINE_p = -DwxDEBUG_LEVEL=0
#__DEBUG_DEFINE_p_1 = --define wxDEBUG_LEVEL=0
#__EXCEPTIONS_DEFINE_p = -DwxNO_EXCEPTIONS
#__EXCEPTIONS_DEFINE_p_1 = --define wxNO_EXCEPTIONS
#__RTTI_DEFINE_p = -DwxNO_RTTI
#__RTTI_DEFINE_p_1 = --define wxNO_RTTI
#__THREAD_DEFINE_p = -DwxNO_THREADS
#__THREAD_DEFINE_p_1 = --define wxNO_THREADS
#__DLLFLAG_p = -DWXUSINGDLL
#__DLLFLAG_p_1 = --define WXUSINGDLL
__WIN32_DPI_MANIFEST_p = \
	--define \
	wxUSE_DPI_AWARE_MANIFEST=$(USE_DPI_AWARE_MANIFEST)
COND_PLATFORM_OS2_1___MAINAPP___os2_emxbindcmd = $(NM) $(appname)$(EXEEXT) \
	| if grep -q pmwin.763 ; then emxbind -ep $(appname)$(EXEEXT) ; fi
#__MAINAPP___os2_emxbindcmd = $(COND_PLATFORM_OS2_1___MAINAPP___os2_emxbindcmd)
__RCDEFDIR_p = --include-dir \
	$(LIBDIRNAME)/wx/include/$(TOOLCHAIN_FULLNAME)
#__MAINAPP___win32rc = MAINAPP_MAINAPP_rc.o
#__MAINAPP_app_Contents_PkgInfo___depname \
#	= simplewindow.app/Contents/PkgInfo
#__MAINAPP_bundle___depname = MAINAPP_bundle
#____MAINAPP_BUNDLE_TGT_REF_DEP = \
#	$(__MAINAPP_app_Contents_PkgInfo___depname)
#____MAINAPP_BUNDLE_TGT_REF_DEP \
#	= $(__MAINAPP_app_Contents_PkgInfo___depname)
#____MAINAPP_BUNDLE_TGT_REF_DEP \
#	= $(__MAINAPP_app_Contents_PkgInfo___depname)
#____MAINAPP_BUNDLE_TGT_REF_DEP \
#	= $(__MAINAPP_app_Contents_PkgInfo___depname)
#____MAINAPP_BUNDLE_TGT_REF_DEP = \
#	$(__MAINAPP_app_Contents_PkgInfo___depname)
COND_MONOLITHIC_0___WXLIB_CORE_p = \
	-lwx_$(PORTNAME)$(WXUNIVNAME)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)_core-$(WX_RELEASE)$(HOST_SUFFIX)
__WXLIB_CORE_p = $(COND_MONOLITHIC_0___WXLIB_CORE_p)
COND_MONOLITHIC_0___WXLIB_BASE_p = \
	-lwx_base$(WXBASEPORT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)
__WXLIB_BASE_p = $(COND_MONOLITHIC_0___WXLIB_BASE_p)
COND_MONOLITHIC_1___WXLIB_MONO_p = \
	-lwx_$(PORTNAME)$(WXUNIVNAME)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)
#__WXLIB_MONO_p = $(COND_MONOLITHIC_1___WXLIB_MONO_p)
#__LIB_SCINTILLA_IF_MONO_p \
#	= \
#	-lwxscintilla$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)
__LIB_TIFF_p \
	= \
	-lwxtiff$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)
__LIB_JPEG_p \
	= \
	-lwxjpeg$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)
__LIB_PNG_p \
	= \
	-lwxpng$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)
#__LIB_ZLIB_p = \
#	-lwxzlib$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)
COND_wxUSE_REGEX_builtin___LIB_REGEX_p = \
	-lwxregex$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)
__LIB_REGEX_p = $(COND_wxUSE_REGEX_builtin___LIB_REGEX_p)
#__LIB_EXPAT_p = \
#	-lwxexpat$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)
### Targets: ###
all: mainapp$(EXEEXT) $(__MAINAPP_bundle___depname)
install: 
uninstall: 
install-strip: install
clean: 
	rm -rf ./.deps ./.pch
	rm -f ./*.o
	rm -f mainapp$(EXEEXT)
	rm -rf mainapp.app
distclean: clean
	rm -f config.cache config.log config.status bk-deps bk-make-pch shared-ld-sh Makefile
mainapp$(EXEEXT): $(MAINAPP_OBJECTS) 
	$(CXX) -o $@ $(MAINAPP_OBJECTS)    -L$(LIBDIRNAME)  $(LDFLAGS_GUI) $(LDFLAGS)  $(WX_LDFLAGS) $(__WXLIB_CORE_p)  $(__WXLIB_BASE_p)  $(__WXLIB_MONO_p) $(__LIB_SCINTILLA_IF_MONO_p) $(__LIB_TIFF_p) $(__LIB_JPEG_p) $(__LIB_PNG_p)  $(EXTRALIBS_FOR_GUI) $(__LIB_ZLIB_p) $(__LIB_REGEX_p) $(__LIB_EXPAT_p) $(EXTRALIBS_FOR_BASE) $(LIBS)
	$(__MAINAPP___os2_emxbindcmd)
MAINAPP_main.o: $(srcdir)/$(appname).cpp 
	$(CXXC) -c -o $@ $(MAINAPP_CXXFLAGS) $(srcdir)/$(appname).cpp
# Include dependency info, if present:
-include ./.deps/*.d
.PHONY: all install uninstall clean distclean MAINAPP_bundle

Please note that the version number of the wxWidgets library being used has to be correct. For eg. the above makefile assumes that you are using wxWidgets 3.1 . But if you use a later version, then 3.1 has to be changed to 3.2 otherwise the build will fail. The specific places where this change has to be done are shown below:

TOOLCHAIN_FULLNAME = msw-unicode-static-3.2
WX_RELEASE = 3.2
WX_CPPFLAGS = -I${wx_top_builddir}/lib/wx/include/msw-unicode-static-3.2 -I${top_srcdir}/include -D_FILE_OFFSET_BITS=64 

At the MSYS2 command make sure you are in the application folder eg.d:\projects\wxProjects and then type make

You should get the following output signifying that the executable has been made.

Run the executable with ./mainapp. The app will run and show a simple window as shown below

What we have now is the debug version of wxWidgets for building wxWidgets applications. You can create a release version also by going to the wxWidgets folder eg. d:\wxWidgets and then using the following commands as before:

mkdir build-release

cd build-release

../configure –disable-shared

followed by a make command

Coming back to the task of running the application, it runs fine as long as you are running it from within MSYS2 command prompt. But if you double click it from the Windows explorer then it starts giving missing runtime DLL errors. These DLLs are the runtime DLL files required for minGW and not wxWidgets.

These DLLs will be found within the msys folder. Eg.if you installed MSYS2 in D:\msys64 then the required DLL files will be in D:\msys64\mingw64\bin

You can either add this folder to the PATH environment variable or copy them to the same folder as your application. That will solve the problem of the runtime DLL not being found.

Remember if you make changes to your source code, then run make clean first to clean the generated files before you run a make again to make a new executable.

CONCLUSION

This was a quick and practical way of setting up wxWidgets in Windows 10 to enable C++ development. The makefile will undergo more changes as you start building projects with multiple source and header files. If you come from a Visual Studio background then having to deal with makefiles is something new as VS takes care of all that automatically. But its good to understand the basic working of a makefile so you are not dependent on a particular IDE or tool to build your application. I will explore wxWidgets programming more in the coming days.

Понравилась статья? Поделить с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
  • Windows 10 игровой режим настройка графики
  • Turn windows feature on or off
  • Sihost exe unknown hard error windows 10 решение проблемы
  • Windows phone как восстановить удаленные фото
  • Cleartype windows server 2019