Как скомпилировать Code::Blocks из исходников

Kate

Administrator
Команда форума
Сегодня я хочу поделиться своим опытом компилирования CodeBlocks из исходников под Windows 7/10. Для начинающих этот увлекательный процесс изобилует подводными камнями и особенностями.

8557b469eda7baeef6ee2312183a6779.jpg

Устанавливаем среду CodeBlocks​

Для начала качаем последние стабильные бинарники codeblocks для Windows вместе с компилятором MinGW, или раздельно IDE и MinGW. В моем случае была скачана и установлена версия codeblocks-20.03-32bit-mingw-64bit-setup.exe c 64 битным компилятором. ( Страница загрузок codeblocks и зеркало. )

Замечание: Версия компилятора должна быть относительно свежей. В данном случае это gcc 8.1.0.

Устанавливаем СodeBlocks по пути, не содержащем длинные имена. Например в папку C:\Soft. Далее необходимо прописать в переменную Path путь к папке бинарных файлов MinGW "C:\Soft\codeblocks\МinGW\bin". Это можно сделать нажав Win + Pause/Break, перейти в Дополнительные параметры системы и открыть Переменные среды. Изменить можно либо системную переменную Path, либо переменную Path среды текущего пользователя (если все операции далее будут выполняться под ним).

Добавить путь к MinGW
Добавить путь к MinGW
Замечание: Установленный в системе компилятор MinGW ( gcc.exe ) должен быть один в системе, либо при запросе из командной строки быть основным доступным. Если по какой-то причине у Вас в системе есть несколько версий данного компилятора, то самым простым способом будет временно переименовать папки с другими его версиями.

Если все правильно сделано, то при вводе во вновь открытой командной строке команды gcc -v должна появиться информация о настройках и версии компилятора.

Следующим шагом необходимо настроить установки компилятора в CodeBlocks. Для этого запускаем CodeBlocks, и в параметрах Settings > Compiler > Toolchain executable настраиваем путь к папке MinGW. Параметры по умолчанию я заменил так:

  • C compiler: gcc.exe
  • C++ compiler: g++.exe
  • Linker for dynamic libs: g++.exe
Остальные оставил как есть:

Настройки компилятора CodeBlocks


Настройки компилятора CodeBlocks

Библиотека wxWidgets​

Скачиваем исходники актуальной версии wxWidgets с сайта. На сегодня это версия wxWidgets-3.1.5. Файлы для Windows упакованы в вариантах Zip и 7z.

Создаем рабочую папку проектов C:\codeblocks\ . Распаковываем архив, получившуюся папку wxWidgets-3.1.5 переносим в C:\codeblocks\ . Необходимо также создать глобальную переменную WXWIN=c:\codeblocks\xWidgets-3.1.5 .

bbffd7cb9508cce957779d91a661becb.jpg

Прежде, чем приступать к сборке, необходимо настроить файл setup.h под требования сборки исходников CodeBlocks. Для Windows открываем в IDE файл wxWidgets - (путь_WXWIN)\include\wx\msw\setup.h

  • В строке 22 контролируем наличие значения #define wxUSE_GUI 1
  • В строке 1642 значение #define wxUSE_GRAPHICS_DIRECT2D 0 меняем на #define wxUSE_GRAPHICS_DIRECT2D 1
Без этих опций при сборке проекта CodeBlocks из исходников компилятор будет выдавать предупреждающие сообщения и останавливать процесс. В результате мне пришлось несколько раз возвращаться и повторно собирать wxWidgets с измененными настройками setup.h. А как Вы помните, это процесс очень не быстрый.

Сохраняем файл setup.h и копируем его из (путь_WXWIN)\include\wx\msw\setup.h в (путь_WXWIN)\include\wx\ .

Важно: Эти два файла всегда должны быть одинаковыми.

Далее wxWidgets необходимо собрать. Существует множество вариантов и опций сборки данной библиотеки, определяющих дальнейшие варианты ее использования в проектах. Так опция MONOLITHIC определяет, будут ли при компиляции библиотеки упакованы в единый файл. Опция SHARED задает тип библиотеки: статическая или динамическая. Опция BUILD определяет, будет ли библиотека поддерживать отладку (debug/release).

Я решил собирать сразу и статические, и динамические библиотеки для debug и для release. Эта задача определила мне 4 варианта запуска процесса со следующими ключами: (SHARED=0 MONOLITHIC=1)

  • SHARED=0 BUILD=debug - статическая отладочная библиотека
  • SHARED=0 BUILD=release - статическая библиотека для релиза
  • SHARED=1 MONOLITHIC=1 BUILD=debug - единая динамическая отладочная библиотека
  • SHARED=1 MONOLITHIC=1 BUILD=release - единая динамическая библиотека для релиза
Для сборки я сделал cmd скрипт, позволяющий частично автоматизировать подготовку и запуск процесса.

cd %WXWIN%\build\msw

REM SHARED=1 - make DLL, SHARED=0 - make LIB
REM MONOLITHIC=1 - make monolithic lib/dll

REM Clean
mingw32-make -f makefile.gcc clean
mingw32-make -f makefile.gcc BUILD=debug USE_XRC=1 SHARED=0 MONOLITHIC=1 UNICODE=1 WXUNIV=0 USE_OPENGL=1 clean
mingw32-make -f makefile.gcc BUILD=debug USE_XRC=1 SHARED=1 MONOLITHIC=1 UNICODE=1 WXUNIV=0 USE_OPENGL=1 clean
mingw32-make -f makefile.gcc BUILD=release USE_XRC=1 SHARED=0 MONOLITHIC=1 UNICODE=1 WXUNIV=0 USE_OPENGL=1 clean
mingw32-make -f makefile.gcc BUILD=release USE_XRC=1 SHARED=1 MONOLITHIC=1 UNICODE=1 WXUNIV=0 USE_OPENGL=1 clean

REM Delete setup.h
if exist %WXWIN%\lib\gcc_lib\mswu (rd /S/Q %WXWIN%\lib\gcc_lib\mswu)
if exist %WXWIN%\lib\gcc_lib\mswud (rd /S/Q %WXWIN%\lib\gcc_lib\mswud)
if exist %WXWIN%\lib\gcc_dll\mswu (rd /S/Q %WXWIN%\lib\gcc_dll\mswu)
if exist %WXWIN%\lib\gcc_dll\mswud (rd /S/Q %WXWIN%\lib\gcc_dll\mswud)

REM Build
start cmd /k "mingw32-make -f makefile.gcc BUILD=debug USE_XRC=1 SHARED=0 MONOLITHIC=1 UNICODE=1 WXUNIV=0"
start cmd /k "mingw32-make -f makefile.gcc BUILD=debug USE_XRC=1 SHARED=1 MONOLITHIC=1 UNICODE=1 WXUNIV=0"
start cmd /k "mingw32-make -f makefile.gcc BUILD=release USE_XRC=1 SHARED=0 MONOLITHIC=1 UNICODE=1 WXUNIV=0"
start cmd /k "mingw32-make -f makefile.gcc BUILD=release USE_XRC=1 SHARED=1 MONOLITHIC=1 UNICODE=1 WXUNIV=0"
Сначала выполняется очистка результатов предыдущих попыток и удаляются каталоги с присутствующим файлом настроек setup.h, который при его отсутствии копируется из (путь_WXWIN)\include\wx\ . Удаление каталогов с данным файлом необходимо на случай его изменения. Так актуальный файл гарантированно будет скопирован в нужные каталоги при сборке. Сборка запускается в 4х независимых cmd процессах, что позволяет несколько полнее загрузить процессор (если у него несколько ядер и потоков) и этим ускорить процесс. Сам процесс сборки у wxWidgets обычно происходит стабильно успешно, но занимает длительное время. У меня обычно на это уходит до 3х часов. В итоге в папке lib wxWidgets появляются две подпапки - gcc_dll и gcc_lib c полным набором релизных и отладочных библиотек. Разница в названиях таких библиотек в наличии 'суффикса' d в имени файла.

Дальше необходимо открыть среду CodeBlocks и в меню Settings > Global Variables добавить переменные wx, wx31, wx31_64. В наборе данных указывается полные пути к папке wxWidgets, вложенным папкам include и lib:

  • base = C:\codeblocks\wxWidgets-3.1.5
  • include = C:\codeblocks\wxWidgets-3.1.5\include
  • lib = C:\codeblocks\wxWidgets-3.1.5\lib
Глобальный путь lib указываем к папке со статически линкуемым набором библиотек.

51de8b89fbc7dc6496492814cb9116d2.jpg

В принципе среда CodeBlocks может и сама запрашивать глобальные переменные, если такие встречаются в проекте.

Теперь можно попробовать собрать тестовый wxWidgets проект, чтобы убедиться, что все сделано правильно. В опциях при создании проекта выбираем wxWidgets 3.1.x (wxSmith, Frame Based). В процессе работы мастера проекта можно увидеть применение уже созданной переменной wx на странице, где требуется указать расположение wxWidgets. Здесь ничего менять не надо, т.к. нужные настройки уже существуют.

42ea326caf2686433b738a095421bc43.jpg

Далее нужно отметить сборку проекта Monolithic, т.к. наша библиотека wxWidgets собиралась именно с такой опцией. Также необходима опция Enable unicode.

da0623c18a723128152c793cb9845270.jpg

После успешной проверки сборки WX проекта можно переходить непосредственно к сборке CodeBlocks из исходников.

Сборка CodeBlocks​

Сначала я взял исходники codeblocks с сайта проекта, и пытался собрать их. На борьбу с разными ошибками и зависимостями ушло несколько дней, пока я не встретил на одном из сайтов рекомендацию брать исходники из SVN репозитория проекта.

Замечание: Исходники CodeBlocks для сборки скачивайте из SVN репозитория проекта.

Для этого я установил программу TortoiseSVN-1.14.1.29085-x64-svn-1.14.1, и с ее помощью подключился к источнику svn://svn.code.sf.net/p/codeblocks/code/trunk , и после обновления данных выполнил экспорт ветки в локальную папку проектов.

Настройка подключения к проекту CodeBlocks


Настройка подключения к проекту CodeBlocks
Экспорт ветки репозитория


Экспорт ветки репозитория
Сохраняем локально в проекты


Сохраняем локально в проекты
Теперь у нас есть актуальные исходники проекта codeblocks для сборки.

Для работы скриптов при сборке проекта codeblocks необходимо наличие в системе доступной для запуска из консоли утилиты Zip. У кого такой утилиты нет, ее можно скачать и установить из источника, прописав в системной переменной Path путь к исполняемому файлу. Утилита должна находиться и выполняться из cmd.

Запускаем установленную ранее IDE CodeBlocks, открываем проект CodeBlocks_wx31_64.workspace из папки C:\codeblocls\codeblocks\src\ . Как видно, проект ориентирован на сборку с wxWidgets 3.1.x и x64. В папке присутствуют и другие проекты, но использованный мной компилятор изначально собирает проекты под 64-битную ОС.

Важно: Изначальный выбор компилятора для сборки wxWidgets определяет тип проекта (х32/х64), выбираемого для сборки codeblocks из исходников. Иначе на финальном этапе не будут находиться те или иные библиотеки. Либо даже после успешной сборке проекта codeblocks при его запуске будет появляться сообщение об ошибке с дальнейшим падением IDE.

На понимание этих тривиальных фактов и исправление у меня ушло пару дней (и опять не одна пересборка wxWidgets).

При открытии проекта IDE нашла и запросила очередную глобальную переменную cb_release_type. Это флаг типа сборки, в поле base вводим -g для сборки с отладочной информацией (либо -O2 для релизной сборки с оптимизацией), и закрываем окно.

093fa1cdf96f1b3378f19497ae49b4af.jpg

В списке проектов находим NassiShneiderman wx3.1.x . Его необходимо отключить, т.к. он требует зависимости, решения к которым я пока не нашел. Отключаем в меню Properties данного проекта на вкладке Build target . Во всплывающем списке Platform нужно снять галку с Windows и поставить на Unix или Mac. После этого данный проект будет исключен из списка компиляции. Среда CodeBlocks при этом может внезапно обнаружить глобальную переменную boost. Оставляем ее как есть (invalid).

Запускаем сборку всего Workspace и ждем ее окончания. После окончания сборки текущий Workspace можно закрыть.

Теперь необходимо запустить скрипт Update31_64.bat из папки проекта codeblocks. Переходим в папку C:\codeblocks\codeblocks\src и запускаем данный скрипт. Происходит магические действия по подготовке и упаковке бинарников собранного ранее проекта.

После этого копируем библиотеку wxmsw315u_gcc_custom.dll из папки C:\codeblocks\wxwidgets-3.1.5\lib\gcc_dll в папку C:\codeblocks\codeblocks\src\devel31_64. Закрываем открытую ранее IDE CodeBlocks и пробуем запустить файл codeblocks.exe из C:\codeblocks\codeblocks\src\devel31_64.

Запуск скомпилированного CodeBlocks
Запуск скомпилированного CodeBlocks
Это работает


Это работает
И так, кратко резюмирую основные трудности:

  • Компилятор для всех выполняемых работ должен быть один.
  • Версия компилятора должна быть актуальной и стабильной
  • Библиотека wxWidgets также должны быть актуальной.
  • Исходники codeblocks необходимо брать из репозитория.
  • Важно помнить разрядность собранных библиотек wxWidgets и выбирать соответствующий проект codeblocks.
  • Изменение системных переменных среды в загруженной IDE не обновляются, требуется ее перезапуск.
Спасибо за внимание.

 
Сверху