Компиляция библиотеки 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. Откроется следующее окно:
Слева выбираем пункт Advanced system settings и попадаем в диалог "System Properties". Затем на вкладке Advanced нажимаем кнопку Environment Variables
Откроется диалог "Environment Variables", в нижнем списке которого нужно найти переменную Path.
Значение этой переменной у вас будет скорее всего другое. Дважды щелкаем на эту переменную, и в открывшемся диалоге добавляем в конец через точку с запятой путь до запускаемых файлов mingw, т.е. в нашем случае до C:\Program Files (x86)\CodeBlocks\MinGW\bin\.
3. Качаем wxWidgets. Нужно скачать файл из раздела "Source Code", для простоты будем считать, что скачиваем архив с исходниками в формате zip или 7z.
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 в конце:
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-ки:
На странице вики wxWidgets рекомендуются такие параметры компиляции:
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, если вы хотите залезать отладчиком внутрь библиотеки.
Если мы хотим скомпилировать библиотеку не в монолитном режиме, то используем следующую команду:
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. После этого мастер создания проекта завершит совю работу, и будет создан новый проект.
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.