- PVSM.RU - https://www.pvsm.ru -
В продолжение поста (новости) wxWidgets. Мелочь, но приятно [1], ловите печеньку.
Картинка взята с ресурса: ru.wikipedia.org [2], автор: Bryan Petty.
Выдержка из Wiki: wxWidgets [3] — это кросс-платформенная [4] библиотека инструментов [5] с открытым исходным кодом [6] для разработки кроссплатформенных на уровне исходного кода приложений, в частности для построения графического интерфейса пользователя [7] (GUI).
Библиотека имеет набор классов для работы с графическими изображениями, HTML, XML документами, архивами, файловыми системами, процессами, подсистемами печати, мультимедиа, сетями, классы для организации многопоточности, отладки, отправки дампов и множество других инструментов.
Внимание! Под катом трафик!
Тройку лет назад заинтересовался кросс-платформенным программированием с использованием выше озаглавленной библиотеки. Каждый раз при сборке этой библиотеки возникало куча проблем. Проблемы не были связанны с тем, что библиотека имела какие-то существенные баги, а были связаны с тем, что при использовании подобных инструментов требующих компиляции (сборки), необходимо внимательно относится к сопровождающей литературе.
Если говорить понятным языком, то необходимо внимательно читать мануалы, readme-файлы
, FAQ
и т.д…
Хотя статей по сборке и использованию wxWidgets
достаточно в сети, все равно считаю нужным поделится своим опытом, постараюсь объяснить шаги, которые приводят к положительному результату, и описать что к чему, чтобы разработчики только начинающие использовать wxWidgets
в своих проектах, меньше наступали на грабли, и сразу перешли к использованию всех функциональных возможностей этой библиотеки.
И так, поехали.
Сборку библиотеки будем производить в операционной системе Windows 7 Professional x32 SP1
. Что касается других OS
, то могу смело заявить, что сборка wxWidgets
под Ubuntu Desktop 12.04
, не вызывает особых сложностей, все прекрасно собирается. Для сборки под GNU/Linux, можно воспользоваться этим [8] мануалом.
В качестве IDE [9] (редактора кода и автоматизации сборки), будем использовать Code::Blocks [10]. Думаю многие уже о нем слышали, поэтому не будем вдаваться в подробности. Упомяну лишь, что C::B
– достаточно мощный инструмент для написания больших приложений, и напрямую «заточен» под использование библиотеки инструментов wxWidgets
, т.к. сам собран с использованием этой библиотеки.
1) Установка компилятора, средств отладки и предварительная настройка:
Средства отладки (дебагер
), обычно устанавливаются по умолчанию вместе с компилятором, в случае компиляторов GCC
и некоторых других, — это файл со скромным названием GDB
.
FAQ: Первые грабли с которыми сталкиваются начинающие разработчики, — это неверная установка используемого для сборки библиотеки компилятора. Большинство устанавливают
MinGW
вместоTDM-GCC
, на котором собственно и ведется разработкаwxWidgets
подWindows
.Ссылка [11]:
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/ [12] хз чем они отличаются…Стоить отметить, что при установке
MinGW
, библиотека может собраться, но с очень малой вероятностью, скорее всего в конце сборки, после многоминутного ожидания, вы получите сообщение об ошибке вроде этой:
if not exist ....libgcc_libmswud mkdir ....libgcc_libmswud
g++ -c -o gcc_mswudmonolib_treectrl.o -g -O0 -mthreads -DHAVE_W32API_H -D__WXMSW__ -D_UNICODE -I....libgcc_libmswud -I....include -W -Wall -DWXBUILDING -I....srctifflibtiff -I....srcjpeg -I....srcpng -I....srczlib -I....srcregex -I....srcexpatlib -I....srcstcscintillainclude -I....srcstcscintillalexlib -I....srcstcscintillasrc -D__WX__ -DSCI_LEXER -DLINK_LEXERS -DwxUSE_BASE=1 -Wno-ctor-dtor-privacy -MTgcc_mswudmonolib_treectrl.o -MFgcc_mswudmonolib_treectrl.o.d -MD -MP ../../src/msw/treectrl.cpp
makefile.gcc:9395: recipe for target 'gcc_mswudmonolib_treectrl.o' failed
Переходим на официальный сайт компилятора TDM-GCC
в раздел загрузки [13], скачиваем и устанавливаем последнюю стабильною версию соответствующую разрядности нашей операционной системы (x32
или x64
). В нашем случае это: tdm-gcc-4.8.1-3.exe
.
Далее стандартная процедура: запускаем мастер установки, и устанавливаем компилятор с опциями по умолчанию.
Совет: При установке каких либо программ, библиотек, распаковки пакетов и т.д., лучше всего использовать, в мастере установки программ, настройки (опции) по умолчанию. Поверьте, это вызовет намного меньше забот, и меньше плясок с бубном вокруг библиотек и программ. Это касается, библиотек, программ, и всевозможных компиляторов.
Настройка компилятора заключается в том, что необходимо добавить в системную переменную окружения Path, путь к бинарным сборкам компилятора, если этого не сделал мастер установки по умолчанию. Обычно это: C:TDM-GCC-32bin
(если директорией установки (распаковки) был выбран корневой католог диска C:
);
Проверка: Проверка работоспособности будет заключаться в следующих действиях: запускаем командную строку (
CMD
), и просто выполняем команду:mingw32-make -v
соответственно видим версию сборки make — компоновщика. Должно появится чтото вроде этого:
2) Загрузка, распаковка и сборка библиотеки wxWidgets
:
Переходим на официальный сайт библиотеки wxWidgets
в раздел загрузки [14], скачиваем и распаковываем последнюю стабильною версию библиотеки для OS Windows
. В нашем случае это: wxMSW-Setup-3.0.0.exe
(Windows Installer
).
Далее стандартная процедура: запускаем мастер распаковки, и распаковываем библиотеку с опциями по умолчанию.
Предварительная настройка компилятора заключается в том, что необходимо добавить системную переменную окружения WXWIN
, которая будет содержать путь к корневому каталогу библиотеки. Обычно это: C:wxWidgets-3.0.0
(если директорией установки (распаковки) был выбран корневой каталог диска C:
);
Собственно приступаем к сборке. Запускаем командную строку (CMD
), и выполняем по порядку следующие команды (дожидаясь завершение выполнения каждой):
cd %WXWIN%buildmsw
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
в раздел загрузки [15], скачиваем и устанавливаем последний стабильный бинарный релиз программы для 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)libgcc_libmswud
Окно Project build options
(Debug
) [Вкладки Search directories - Linker
]:
$(WXWIN)libgcc_lib
Окно Project build options
(Release
) [Вкладка Linker settings
]:
Окно Project build options
(Release
) [Вкладки Search directories - Compiler и Resource compiler
]:
$(WXWIN)libgcc_libmswu
Окно Project build options
(Release
) [Вкладки Search directories - Linker
]:
$(WXWIN)libgcc_lib
Далее сохраняем настройки путем нажатия кнопки [Ок
] в форме настройки сборки проекта Project build options
.
Скомпилируем (собирем) наше приложение (Build --> Build and run
):
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 ....libgcc_lib mkdir ....libgcc_lib
process_begin: CreateProcess(NULL, -c «if not exist ....libgcc_lib mkdir ....libgcc_
lib», ...) failed.
make (e=2): =х єфрхЄё эрщЄш єърчрээvщ Їрщы.
mingw32-make: *** [....libgcc_lib] Error 2
Ответ/Решение:
Run to cmd: set PATH=c:mingwbinВопрос/Проблема:
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.4include
lib: C:wxWidgets-2.9.4lib
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.0includewxplatform.h|189|fatal error: wx/setup.h: No such file or directory|
Решение такое:
Projects --> Build options…
Debug (Search directories)
$(WXWIN)libgcc_libmswud <--> $(WXWIN)libgcc_dllmswudБывают и неприятности. Например линовка может выдавать следующую ошибку:
rem gcc_mswudllmonodll_xh_combo.o: file not recognized: Memory exhausted
rem collect2.exe: error: ld returned 1 exit status
rem mingw32-make.exe: *** [....libgcc_dllwxmsw28u_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 для линковщика(можно и для компилятора), но при этом надо настраивать ОС.
Также обойти проблему можно не используя монолитную сборку, или отказавшись от создания динамических библиотек для монолитной сборки, статические собираются без этой ошибки.
p/s.
Пост ориентирован прежде всего на начинающую аудиторию программистов, и не в коем случае не претендует на истину в последней инстанции.
В следующих постах опишу как «правильно» собрать библиотеку компьютерного зрения OpenCV [16].
Спасибо за внимание.
Автор: zhogar
Источник [17]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/razrabotka/55852
Ссылки в тексте:
[1] wxWidgets. Мелочь, но приятно: http://habrahabr.ru/post/212333/
[2] ru.wikipedia.org: http://ru.wikipedia.org/
[3] wxWidgets: http://ru.wikipedia.org/wiki/WxWidgets
[4] кросс-платформенная: http://ru.wikipedia.org/wiki/%D0%9A%D1%80%D0%BE%D1%81%D1%81-%D0%BF%D0%BB%D0%B0%D1%82%D1%84%D0%BE%D1%80%D0%BC%D0%B5%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%BD%D0%BE%D0%B5_%D0%BE%D0%B1%D0%B5%D1%81%D0%BF%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5
[5] библиотека инструментов: http://ru.wikipedia.org/wiki/%D0%91%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%D0%B0_%28%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29
[6] открытым исходным кодом: http://ru.wikipedia.org/wiki/%D0%9E%D1%82%D0%BA%D1%80%D1%8B%D1%82%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%BD%D0%BE%D0%B5_%D0%BE%D0%B1%D0%B5%D1%81%D0%BF%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5
[7] графического интерфейса пользователя: http://ru.wikipedia.org/wiki/%D0%93%D1%80%D0%B0%D1%84%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81_%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8F
[8] этим: http://wiki.wxwidgets.org/Installing_and_configuring_under_Ubuntu
[9] IDE: http://ru.wikipedia.org/wiki/%D0%98%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%B0%D1%8F_%D1%81%D1%80%D0%B5%D0%B4%D0%B0_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8
[10] Code::Blocks: http://ru.wikipedia.org/wiki/Code::Blocks
[11] Ссылка: http://www.sql.ru/forum/768259/chto-takoe-tdm-gcc
[12] http://sourceforge.net/downloads/mingw/MinGW/BaseSystem/GCC/Version4/: http://sourceforge.net/downloads/mingw/MinGW/BaseSystem/GCC/Version4/
[13] загрузки: http://tdm-gcc.tdragon.net/download
[14] загрузки: http://www.wxwidgets.org/downloads/
[15] загрузки: http://www.codeblocks.org/downloads
[16] OpenCV: https://ru.wikipedia.org/wiki/OpenCV
[17] Источник: http://habrahabr.ru/post/212027/
Нажмите здесь для печати.