Pull to refresh

Библиотека инструментов wxWidgets. Сборка

Reading time 10 min
Views 65K
В продолжение поста (новости) 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.


Спасибо за внимание.
Only registered users can participate in poll. Log in, please.
Как Вам пост?
70.39% Отличный туториал, давай еще! 126
17.32% Давай по новой Миша, все фигня! 31
12.29% Полно уже, ненужно это здесь. 22
179 users voted. 85 users abstained.
Tags:
Hubs:
+13
Comments 24
Comments Comments 24

Articles