Компиляция библиотеки wxWidgets в Code::Blocks

Немного рекламы

Если вам нужна кроссплатформенная библиотека для создания интерфейса программы, то стоит в первую очередь обратить на 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.png: 800x640, 36k (19.10.2014 18:16)

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

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

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

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

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

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

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

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

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

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

cd "C:\Library\wxwidgets\build\msw\"

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 в монолитном режиме:

А вот список файлов при компиляции в разные dll-ки:

files_many.png: 610x620, 43k (19.10.2014 18:15)

На странице вики wxWidgets рекомендуются такие параметры компиляции:

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

Здесь:

  • Параметр USE_XRC=1 указывает, что при использовании библиотеки можно будет использовать формат XRC для описания интерфейса - формат, основанный на XML/
  • Параметр SHARED=1 обозначает, что wxWidgets будет подключаться как dll, а не линковаться внутрь создаваемого exe-шника, который будет использовать wxWidgets.
  • Параметр UNICODE=1 указывает, что программа будет использовать кодировку Unicode.
  • Параметр USE_OPENGL=1 указывает, что нас интересуют возможности библиотеки, связанные с технологией OpenGL.
  • Параметр BUILD=release указывает, что библиотека wxWidgets должна быть скомпилирована без отладочных символов, что ускорит ее работу и уменьшит размер. Параметр может быть записан как BUILD=debug, если вы хотите залезать отладчиком внутрь библиотеки.

Если мы хотим скомпилировать библиотеку не в монолитном режиме, то используем следующую команду:

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

Если вы откроете файл makefile.gcc, то сможете увидеть и другие параметры, позволяющие исключить из библиотеки некоторые возможности, например, ненавистные многим риббоны (USE_RIBBON). Оперируя такими параметрами, возможно, вы сможете уменьшить размер создаваемых dll-ок, что наиболее актуально для компиляции в монолитном режиме.

9. Ждем окончания компиляции... Этот процесс может занять более 10 минут. К счастью, у wxWidgets нет никаких сторонних зависимостей, поэтому, как правило, компиляция завершается удачно. После окончания компиляции в папке C:\Library\wxwidgets\lib\gcc_dll\ будут созданы объектные файлы и dll-ки, те, что были показаны на картинках выше в п. 8.

Компиляция проекта с использованием wxWidgets

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

10.1. Создаем новый проект. Для этого в Code::Blocks выбираем пункт меню "File - New - Project...".

10.2. В открывшемся диалоге в разделе "Projects" выбираем тип проекта "wxWidgets project".

10.3. Следующее окно диалога не предсталяет особой ценности - это окно приветствия для данного типа проекта. Внизу есть флажок, установив который, вы избавитесь от показа этого окна в будущем.

10.4. В следующем окне нужно выбрать версию wxWidgets. Для всех примеров этой статьи я использовал wxWidgets 3.0.2, поэтому выбираем пункт "wxWidgets 3.0.x".

Если у вас в списке нет нужной версии wxWidgets, вам нужно обновить Code::Blocks.

10.5. Далее вводим название проекта и путь, где он будет создан.

10.6. В следующем окне можно заполнить поля, рассказывающее об авторе. Эти поля являются не обязательными, их можно оставить пустыми.

10.7. Затем выбираем инструмент, с помощью которого мы будем создавать интерфейс (группа переключателей "Preferred GUI Builder"). Я обычно предпочитаю создавать GUI вручную (переключатель "None"), но можно использовать инструмент для создания интерфейса с помощью мышки.

В этом же окне выбирается тип приложения ("Application Type"): главное окно будет диалогом ("Dialog Based") или полноценным окном ("Frame Based"). Первый тип подходит для небольших приложений, при этом у диалога не может быть строки статуса и главного меню.

10.8. В следующем окне нужно указать путь до библиотеки wxWidgets, куда вы распаковывали скачанный архив.

10.9. Если вы впервые создаете проект на основе wxWidgets, то Code::Blocks покажет вам еще один диалог, где нужно указать путь до wxWidgets еще раз. Это нужно уже для глобальных настроек IDE.

При этом вы можете указать конкретные пути, где у вас расположены вложенные папки "include", "lib" и т.д. Если эти поля оставить пустыми, то будут использоваться пути по умолчанию. Эти поля могут быть полезны, если вы переименуете, например, папку "lib" с целью создания другой папки "lib", скомпилированной с другими параметрами. Поскольку мы ничего такого не делали, оставим дополнительные поля пустыми.

В будущем эти параметры можно поменять, выбрав пункт меню "Settings - Global variables..."

10.10. Затем нужно установить (или подтвердить) некоторые параметры для компиляции - тип компилятора и папки для отладочной и релизной версии сборки нашего проекта.

10.11. Следующее окно уже более интересное и важное.

Здесь мы должны установить параметры, с которыми была скомпилирована библиотека wxWidgets.

  • Если при компиляции был установлен параметр SHARED=1, должен быть установлен флажок "Use wxWidgets DLL", иначе он должен быть снят.
  • Если при компиляции был установлен параметр MONOLITHIC=1, должен быть установлен флажок "wxWidgets is built as a monolithic library", иначе он должен быть снят.
  • Если при компиляции был установлен параметр UNICODE=1, должен быть установлен флажок "Use unicode", иначе он должен быть снят.

10.12. Если вы компилировали библиотеку wxWidgets только в релизном режиме (с параметром BUILD=release), то при переходе к следующему окну Code::Blocks предложит в режиме отладки нашего приложения использовать также релизную версию wxWidgets. Придется согласиться.

10.11. Если вы компилировали wxWidgets не как монолитную библиотеку, то будет показано еще одно окно, в котором нужно выбрать, какие пакеты wxWidgets вам понадобятся (в монолитном режиме они все скомпилены в одну dll-ку).

Можно выбирать несколько пуктов списка (или ничего не выбирать).

10.12. После этого мастер создания проекта завершит совю работу, и будет создан новый проект.

codeblocks_01.png: 1180x1024, 95k (19.10.2014 18:15)

10.13. Теперь можно в верхней панели выбрать цель компиляции (Release или Debug) и скомпилировать проект (выбрав, пункт меню "Build - Build" или "Build - Rebuild").

Проект должен скомпилироваться без ошибок, и его можно запустить с помощью пункта меню "Build - Run". Результат будет выглядеть следующим образом:

10.14. После компиляции проект без проблем запускается из Code::Blocks, но exe-шник не будет запускаться обычными способами (из файлового менеджера), поскольку рядом с exe-шником нет нужных dll-ок из wxWidgets. Скопировать их можно из папки C:\Library\wxwidgets\lib\gcc_dll\ (или ее аналога, если вы распаковывали wxWidgets в другую папку). Какие именно понадобятся dll-ки уже зависит от проекта. Но в любом случае при запуске скомпилированного exe-шника Windows напишет, какого файла не хватает.

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

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


Немного рекламы

Вы можете подписаться на новости сайта через RSS, Группу Вконтакте или Канал в Telegram.
5 stars

Рейтинг 4.8/5. Всего 18 голос(а, ов)



Виктор 04.12.2015 - 15:05

Компиляция библиотеки wxWidgets в Code::Blocks

Спс. Если бы не нашел Вашу статью, наверное, плюнул бы на wxWidgets. Было 5 неудачных попыток его установкиfrowning smiley.

Сергей 12.12.2015 - 12:22

Компиляция библиотеки wxWidgets в Code::Blocks

единственное рабочеспасобное описание автору спасибо

Ваня 04.02.2016 - 11:51

Благодарность! Всё заработало!happy smiley

Виталий 22.02.2016 - 19:46

танцы с бубном

Windows 10 базируется на 8 и 8.1, так какого лешего у меня не собирается, делаю все по инструкции, объясните более подробный путь, а то не все очевидно

Виталий 05.06.2016 - 10:34

танцы с бубном

От предидущего комента через несколько дней нашел другой способ, все заработало с версией 3.0.1, после выхода 3.1.0 для винды 10 29 февраля повторил, успешно, на сайте есть собранные библиотеки под ms visual cpp и для gcc

Moose 07.09.2016 - 12:11

не работает

Пытался компилировать версию 3.1.0 - не получается.
1. Ругается на отсутствие Debug, но пишел не как у вас предупреждение, а что Debug Target will not be created.
2. При попытке собрать проект пишет, что не существует файл setup.h

Все остальные настройки как у вас.

Gabd 27.10.2016 - 07:08

должно работать

Имхо, надо проверить пути (Project - Build options... - Search directories) и глобальные переменные (Settings - Global variables... - wx)

gress 10.11.2016 - 21:29

не запстиля тест

ошибка ld.exe||cannot find -lwxmsw30ud|

Иван 30.01.2017 - 20:52

Компиляция библиотеки wxWidgets в Code::Blocks

компилировал tdm-gcc 5.1, напрочь отказывалась собираться, помогло добавление опции CXXFLAGS=-sdt=gnu++11


Подписаться на комментарии
Автор:
Тема:
 Ваш комментарий
 
 
Введите код 411