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

Обновлено: 04.07.2024

Если вам нужна кроссплатформенная библиотека для создания интерфейса программы, то стоит в первую очередь обратить на wxWidgets или Qt. Про Qt много всего интересного написано на сайте Блог программиста, однако я обычно предпочитаю wxWidgets за чуть меньший размер dll-ок, которые необходимо при этом добавлять в программу, да и компилировать программу с ней несколько легче. С другой стороны, wxWidgets - это библиотека исключительно для построения интерфейсов, в то время как Qt - это целый фреймворк, который имеет множество дополнительных возможностей, напрямую с интерфейсом не связанные. Как видно из заголовка, эта статья будет посвящена wxWidgets.

На мой взгляд для кроссплатформенной разработки на C++ в качестве среды разработки больше всего подходит Code::Blocks, с каждой версией этой IDE пользоваться становится все легче, и все лучше она работает "из коробки". В этой статье мы рассмотрим процесс компиляции библиотеки wxWidgets в этой среде.

На странице загрузки wxWidgets можно скачать уже скомпилированные объектные файлы для этой библиотеки, но иногда нужно самому скомпилировать библиотеку, например, если требуется задать какие-то параметры компиляции или скомпилировать каким-нибудь специфическим компилятором.

В этой статье мы рассмотрим компиляцию wxWidgets с помощью компилятора mingw, который прилагается с Code::Blocks. На всякий случай напомню, что mingw - это компилятор GCC под Windows.

Компиляция библиотеки wxWidgets

0. Качаем Code::Blocks Главное скачать Code::Blocks с интегрированным mingw.

1. Устанавливаем Code::Blocks. Здесь нет ничего особенного, под Windows жмем Next -> Next -> Next. Все как обычно.

2. Установка переменной окружения PATH. Code::Blocks может использовать как сторонние компиляторы, так и интегрированный mingw (именно этот случай мы рассматриваем), который после установки будет располагаться в папке C:\Program Files (x86)\CodeBlocks\MinGW\. Чтобы было проще использовать этот компилятор, желательно добавить этот путь в переменную окружения PATH. В принципе, этого можно не делать, но тогда во многих случаях при работе с тем же компилятором из командной строки придется или указывать полный путь до компилятора, или добавлять его в ту же самую переменную при каждом сеансе работы. ИМХО, лучше установить эту переменную окружения сразу.

Для того, чтобы установить переменную окружения под Windows, нужно попасть в диалог "System Properties" (поскольку у меня англоязычная Windows, все названия я буду приводить на английском языке, думаю, что найти их русскоязычный аналог не составит труда). Этот диалог достаточно глубоко закопан, чтобы в него попасть под Windows 8.1, нажимаем правую кнопку мыши на кнопке Пуск, выбираем пункт меню System. Откроется следующее окно:

system.jpg: 800x640, 36k (19.10.2014 18:16)

Слева выбираем пункт Advanced system settings и попадаем в диалог "System Properties". Затем на вкладке Advanced нажимаем кнопку Environment Variables

advanced.jpg: 426x475, 13k (19.10.2014 18:15)

Откроется диалог "Environment Variables", в нижнем списке которого нужно найти переменную Path.

variables.jpg: 394x437, 12k (19.10.2014 18:16)

Значение этой переменной у вас будет скорее всего другое. Дважды щелкаем на эту переменную, и в открывшемся диалоге добавляем в конец через точку с запятой путь до запускаемых файлов mingw, т.е. в нашем случае до C:\Program Files (x86)\CodeBlocks\MinGW\bin\.

3. Качаем wxWidgets. Нужно скачать файл из раздела "Source Code", для простоты будем считать, что скачиваем архив с исходниками в формате zip или 7z.

wx_download.jpg: 299x289, 15k (19.10.2014 18:17)

4. Распаковываем архив с wxWidgets в какую-нибудь папку, например, в C:\Library\wxwidgets\.

5. Открываем командную строку с помощью команды cmd.

6. В архиве wxWidgets есть специальная папка ("build\msw"), в которой хранятся файлы проекток для компиляции библиотеки под Windows с помощью различных сред. Переходим в эту папку с помощью команды

7. Если вы уже пытались (безуспешно) или с другими параметрами компилировать wxWidgets, то нужно предварительно удалить следы предыдущей компиляции. Разумеется, можно просто удалить папку с распакованными файлами библиотеки, а можно воспользоваться скриптом makefile. На самом деле удаление результатов компиляции с помощью makefile может быть полезно, если вы хотите заново перекомпилировать wxWidgets с каким-то определенным набором параметров, в то время как файлы, удачно скомпилированные с другими параметрами компиляции, оставить. Далее (в п. 8) мы будем компилировать библиотеку с использованием параметров USE_XRC=1 SHARED=1 MONOLITHIC=1 UNICODE=1 USE_OPENGL=1 BUILD=release, поэтому команда удаления должна иметь точно такие же параметры с добавлением команды clean в конце:

mingw32-make.exe -f makefile.gcc USE_XRC=1 SHARED=1 MONOLITHIC=1
UNICODE=1 USE_OPENGL=1 BUILD=release clean

mingw32-make.exe -f makefile.gcc USE_XRC=1 SHARED=1 MONOLITHIC=0
UNICODE=1 USE_OPENGL=1 BUILD=release clean

Если во время выполнения этой команды вы получите ошибку о том, что команда mingw32-make не найдена, значит, вы не добавили путь до этой команды в переменную окружения PATH (см. п. 2).

8. Осталось в той же папке C:\Library\wxwidgets\build\msw\ запустить компиляцию исходников библиотеки. Теперь мы должны выбрать, компилируем мы библиотеку как монолитную (с параметром компиляции MONOLITHIC=1), когда будет создана одна большая dll-ка, или не монолитную, когда различные пакеты будут собраны в отдельных dll-ках (с параметром компиляции MONOLITHIC=0).

Забегая вперед, вот результирующие файлы, после компиляции wxWidgets в монолитном режиме:

Выдержка из 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 .

Переходим на официальный сайт компилятора 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 ]:


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


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

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


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

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

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


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

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

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

Далее сохраняем настройки путем нажатия кнопки [ Ок ] в форме настройки сборки проекта 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 ..\..\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

Вопрос/Проблема:
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 баги пофиксили, теперь можно смело собирать при помощи указанного компилятора, соблюдая те же (описанные) правила.

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

Как и обещал, пишу продолжение своей заметки про wxWidgets. В этом посте будет описана установка wxWidgets и Code::Blocks под различными операционными системами, основы создания GUI с помощью wxSmith, а также приведены небольшие примеры кода.

1. Установка wxWidgets и Code::Blocks

Поскольку мы имеем дело с кроссплатформенной разработкой, тут все зависит от используемой нами ОС. Под Windows нужно скачать wxPack и компилятор MinGW отсюда, последнюю версию Code::Blocks без MinGW отсюда и утилиту wx-config.exe отсюда. Устанавливаем wxPack, затем MinGW, затем Code::Blocks. Утилиту wx-config.exe копируем в «C:\Windows\» или где там у вас стоит Винда.

Дополнение: Как выяснилось, можно поставить и более свежую версию MinGW, скажем, если вы хотите использовать в своем проекте возможности C++0x . Даже wxPack не нужен, достаточно поставить пакет wxMSW отсюда. Только учтите, что кое-где в wxWidgets используются расширения GCC, не входящие в стандарт C++0x , поэтому в Project → Build Options → Compiler Settings → Other Options нужно дописать флаг -std=gnu++0x . Флаг -std=c++0x , который Code::Blocks позволяет выставить с помощью галочки в соседней вкладке Compiler Flags, не годится.

В Ubuntu/Debian установка происходит следующим образом:

Установка во FreeBSD намного проще, ибо все зависимости тянутся автоматом:

В «Linker Settings → Other linker options» прописываем:

Все приведенное выше писалось по памяти и небольшой шпаргалке, сохраненной на GMail, так что в случае возникновения проблем, пожалуйста, отпишитесь в комментариях. С вероятностью 90% решение будет заключаться в прописывании правильных путей в настройках Code::Blocks или правке переменных окружения.

При портировании проекта из *nix в Windows, нужно убедиться, что в «Project → Build Options → Compiler/Linker Settings» wx-config вызывается с параметром --static=yes .

Дополнение: Есть сведения, что в репозитории Ubuntu лежит устаревшая и содержащая ошибки версия Code::Blocks, в связи с чем рекомендуется использовать ночные сборки или компилировать Code::Blocks из исходников. Подробности можно найти здесь.

2. Создание графического интерфейса

В комплекте с Code::Blocks идет плагин wxSmith, предназначенный для редактирования GUI. Увидеть его можно, открыв в окне Management (слева) вкладку Resources. Плагин не сильно похож на редактор GUI в Borland Delphi, но разобраться в нем просто.

Для меня самым сложным было понять, что в 90% случаев весь лайаут строится на основе wxBoxSizer. Для примера рассмотрим мои наброски интерфейса mp3-плеера:

eaxPlayer

Вот как выглядит дерево элементов управления:

Дерево элементов управления

С помощью свойств Proportion, Shaped, Expand, Placement и Border можно добиться практически любого вообразимого расположения элементов. Настроить эти свойства можно в Quick Properties Panel (нижняя кнопка с буквой Q в правой части wxSmith). На словах довольно сложно объяснить, каким свойствам какие значения нужно присваивать для достижения определенного результата. Поэкспериментируйте немного и сами все поймете.

3. Использование регулярных выражений

Еще кое-что, касающееся регулярных выражений в wxWidgets, вы найдете в пункте 5 далее по тексту.

4. Интернационализация в wxWidgets

Осталось дописать несколько строк в коде программы:

// ^^^ дописали вот это ^^^

Также можете распространять вместе с программой и .po файл. Чисто на случай, если найдутся добровольцы, желающие перевести ее на свой родной язык. Чтобы облегчить им работу, изначально используйте английский. Вряд ли в Японии или Египте многие владеют русским языком.

Обратите внимание на то, как выделяется память для временного буфера. В современном C++ в случае нехватки памяти оператор new вызывает исключение std::bad_alloc. Я вот, к примеру, очень долго этого не знал и после вызова new делал проверку в стиле if(ptr != 0) .

6. Многопоточность в wxWidgets

Рассмотрим простейший пример. Есть поток, который в цикле инкрементирует значение счетчика до тех пор, пока значение некого флага не будет установлено равным true. Когда это происходит, поток завершает работу. Доступ к флагу регулируется с помощью мьютекса. По-моему, проще некуда.

Пример может показаться несколько бессмысленным, но на самом деле это не совсем так. Значения счетчиков сильно зависят от загруженности системы. Если добавить в метод CounterThread::Entry() какие-нибудь действия с оперативной памятью (например, сортировку массива «пузырьком») и с жестким диском (чтение/запись временного файла), счетчик будет вести себя еще более непредсказуемо. А случайные числа бывают очень полезны (например, в криптографии) и зачастую их не так уж просто получить.

Оптимальное число потоков равно числу имеющихся на борту ядер процессора, которое можно определить с помощью функции wxThread::GetCPUCount(). Предварительно следует задать достаточно большой размер массива m_CounterThreads или использовать vector.

7. Где взять дополнительную инфу?

Я продемонстрировал лишь некоторые возможности wxWidgets. За более подробной информацией обращайтесь к официальной документации на Doxygen, а также к wiki.

Из русскоязычных сайтов я бы рекомендовал блог Николая Тюшкова и сайт wxWidgets.info. Первый ведет и регулярно обновляет практикующий программист, использующие в своей работе, помимо прочего, wxWidgets. Второй не обновлялся с 2009 года, но содержит множество актуальных статей по теме.

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

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

Categories

Устанавливаем WxWidgets под Ubuntu 7.04 feisty

Мой опыт установки, конечно не факт что правильный и полный, но выстраданный:) Говорят лучше ставить готовыми пакетами которые можно скачать с офф сайта wxWidgets, я решил компилить сам. Трафика гораздо меньше да и полезнее для общего развития. Так как в процессе меня этот незнакомый мир достал по самые нихочу, буду краток.

Компиляция wxWidgets

Качаем сорцы библиотеки, распаковываем их, ставим нужные патчи если надо. В терминале заходим в корневую папку библиотеки (/home/begemot/_work/wxWidgets-2.8.5 в моем случае), и выполняем последующие команды:

  • cd /home/begemot/_work/wxWidgets-2.8.5
  • mkdir gtk-build
  • cd gtk-build
  • mkdir debug
  • cd debug
  • ../../configure --with-gtk --enable-unicode --disable-shared --enable-static --enable-debug

Повторям команду конфигурирования. Получаем отсутвие пакетов GTK для разработчиков - открываем менеджер пакетов и ищем “libgtk dev”, находим libgtk2.0–dev и с радостью ставим.

Опять же конфигурирование, у меня на этот раз сработало. Дальше make и 15 минут релакисируем. Если все ок – sudo make install (вводим пароль если просит). В некоторых туториалах написанно что make unstall можно не делать – я не делал и потерял несколько часов, пока в аську не пришел TRex

Дальше делаем релиз:

  • cd ../
  • mkdir release
  • cd release
  • ../../configure --with-gtk --enable-unicode --disable-shared --enable-static --disable-debug --enable-final
  • make
  • sudo make install

После make тут мне выдало – внутренняя ошибка компилятора: Segmentation fault, make clean и еще раз make – “../../include/wx/gtk/filedlg.h:67: внутренняя ошибка компилятора: Aborted”. Удалил папу Release, перегрузился, скомпилилось.

Пишем wx-config --version, если возвращает версию библиотеки значит все ок.

Как собрать\посмотреть wxWidgets samples

“Then, to test more in depth, you can look at the samples. Open the Samples folder located at wxGTK-2.8.4/gtk-build/samples (be careful : wxGTK-2.8.4/samples contains the source code, while wxGTK-2.8.4/gtk-build/samples contains the makefiles for your system. for building samples, you will want to cd into the latter, while to study the code you will want to open the former) ”

В терминале идем в /home/begemot/_work/wxWidgets-2.8.5/gtk-build/release/samples выбираем пример, заходим в его папку, пишем make ждем и запускаем.

Установка Code::Blocks

Последнии ночные билды искать на форуме Code:Blocks’a. Я качал отсюда (инструкция). Добавив в репозитарий и установив ключ, идем в менеджере пакетов ищем и ставим libcodeblocks.

Пытаемся запустить его из главного меню, если видно что пытается запуститься, но ничего не происходит – пытаемся запустить его с консоли (найдете где он), тогда видно причину “codeblocks: error while loading shared libraries: libwx_gtk2u_aui-2.8.so.0: cannot open shared object file: No such file or directory”. В менеджере пакетов ставим недостающую либу. Моей версии этого хватило.

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

/usr/local/include/wx-2.8/wx/hashmap.h:: In member function ‘wxLongToLongHashMap_wxImplementation_HashTable::Node** wxLongToLongHashMap_wxImplementation_HashTable::GetNodePtr(const long int&) const’:
/usr/local/include/wx-2.8/wx/hashmap.h:714: предупреждение: доступ по указателю с приведением типа нарушает правила перекрытия объектов в памяти
/usr/local/include/wx-2.8/wx/clntdata.h:: In member function ‘wxShadowObjectMethods_wxImplementation_HashTable::Node** wxShadowObjectMethods_wxImplementation_HashTable::GetNodePtr(const wxString&) const’:
………

Решилось отключением опции “что-то там по поводу всех предупреждений компилятора” в настройках проекта.

Какие еще были проблемы

Незнание команд линукса. Вот что вам может понадобится (кроме инета и терпения) – cd, dir, mkdir, rm – удалить файл, rm -rf удалить не пустой каталог, chmod и chown.

В процессе всех этих манипуляций почему-то часть папок\файлов в моей папке получили владельцем рута. И я работать с ними толком не мог. Помогла команда “chown -R begemot *” в своем каталоге, подозреваю что надо ввести sudo сначало, но у меня видимо сесия рута была уже открыта.

После очередной перезагрузки при попытки логина, я получил офигенную штуку – “Серверу GDM не удалось записать в ваш авторизационный файл нет места или домашний каталог не удалось открыть для записи. ”. Нашел ответ. Перегружаем систему, жмем Еск, загружаемся в Restore mode (или как он там называется). В процессе система говорит что ошибка не может смонтировать систему, просит пароль рута. дальше пытаетесь чистить что у вас есть – я убил все дистрибутивы и *.o файлы в gtk-build/debug gtk-build/release и смог войти. Тут выяснилось что если бы чистил корзину – проблемы бы не было , так что чистите корзины за собой господа.

Попытался добавить гиг, к винту в самой вмваре (было 4). В интерфейсе вмваре эту возможность фиг найдешь, нашел на ixbt. vmware-vdiskmanager.exe -x 5Gb F:\VMachines\Ubuntu\Ubuntu.vmdk . Но предварительно сделайте бекап! Он вам еще пригодится . Место то мы увеличили, но это только “физический” винт, логический сектор придется увеличивать в самой гостевой системе, что логично. Если загрузиться с Ubuntu live-cd то там должен быть GNOME partition editor, Система->Администрирование->GNOME Partition Editor если нету идите вы.

Дальше тыкаясь там в разные кнопки и менюшки, я запорол весь диск. ХЗ как это там получилось… Хорошо что я сделал бекап Вот еще думаю что делать то ли так жить, то ли попытатся еще раз ресайзить диск и перерасбить…

И еще одно, в процессе установки система качала ряд пакетов с инета, в целях экономии трафика в случае чего, я их забекапил на реальных винт. Лежат они в папке – /var/cache/apt/archives, читать подробнее. Прежде чем качать пакеты проверьте галочку “сохранять скачанные пакеты в кеши”, в опциях Synaptic’a.

Дополнительные ссылки

А пока меня этот линукс достал надолго, главное установилось, мое приложение скомпилилось и запустилось. Вообщем можно писать (хотя меня и сильно смущает размер ехе под wxWidgets). Думаю что теперь долго в линукс не полезу, покрайне мере пока не напишу хоть какую-то функциональность на винде. Но впереди еще MAC OS X (мне уже принисли XCode), а так же настройка проектов для wxWidgets.

Читайте также: