Как создать dll библиотеку в codeblocks

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

В этой статье описывается, как настроить новые библиотеки в среде Code::Blocks.

Введение

Главные файлы

Первое, что нам нужно сделать, это извлечь все папки и файлы в какую-нибудь папку, например, в папку Library, расположенную на рабочем столе.

Затем в нашей IDE мы создаем новый проект. Теперь самый важный момент, нажимаем на кнопку, как показано на рисунке:


В появившемся окне слева щелкните по имени нашего проекта (чтобы не делать это отдельно для режима Debug и Release), затем на вкладке Search directories, затем на вкладке Compiler:


Нажмите Добавить и введите путь* к папке include в папке библиотеки, в моем случае это будет:
C:\Users\User\Desktop\Biblioteka\include.

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

Ссылка

С открытым окном (Project -> build options) мы возвращаемся на вкладку Search directories, но на этот раз открываем вкладку Linker.


Снова нажмите кнопку Add и введите путь* к папке lib в папке библиотеки, в моем случае он выглядит следующим образом: Библиотека C:\Users\User\Desktop\Biblioteka\lib.


*.dll файлы


Завершение

Если вы сделали все так, как я описал в этой короткой статье, ваш проект должен компилироваться правильно, без ошибок типа:

Однако, если ни один из них не отображается, очевидно, что имя заголовочного файла не существует, или вы не добавили все необходимые файлы в компоновщик.

Репутация: нет
Всего: нет

Репутация: 63
Всего: 196

Petr1993, ничего. Динамическую библиотеку можно подключать только динамически. Для этого достаточно добавить dll в проект (я так понимаю, компилятор у тебя mingw).

Репутация: нет
Всего: нет

Да, компилятор mingw.
Но разве нельзя подключить библиотеку с неявной компоновкой?

Репутация: нет
Всего: 2

если ты о статической компоновке, то:

- нужно создать изначально статическую библиотеку (выбирается при создании проекта)
- указать путь к ней в том проекте, в который ты хочешь её подключить
- собрать проект

При этом код библиотеки будет скомпонован вместе с твоим кодом в один бинарник.
То есть в случае динамической линковки библиотека хранится в виде отдельного файла (so/dll), в случае статической - она включается в состав самого исполняемого файла.

Репутация: нет
Всего: нет

А что тогда означает явное и неявное подключение динамической библиотеки?

Репутация: нет
Всего: 2

А там, откуда ты взял этот термин, не написано?

Мне не приходилось пользоваться.

Репутация: нет
Всего: нет

Там написано что они отличаються методами доступа к функциям динамической библиотеки.

Репутация: нет
Всего: 2

"Существует два способа загрузки DLL: с явной и неявной компоновкой. "

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

Первый вариант, зачастую, можно реализовать настройками проекта, второй же придётся программировать непосредственно в приложении. Причём, насколько мне представляется, второй вариант довольно платформозависимый.

В общем по началу намного понятнее, проще и универсальнее использовать только первый способ, это то, что описал выше bsa.

Репутация: нет
Всего: нет

Репутация: 63
Всего: 196

Загрузить библиотеку во время выполнения под Windows можно так:

При этом в библиотеке должна быть функция:

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это! хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

[ Время генерации скрипта: 0.1183 ] [ Использовано запросов: 21 ] [ GZIP включён ]

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


Устанавливаем среду 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 .


Прежде, чем приступать к сборке, необходимо настроить файл setup.h под требования сборки исходников CodeBlocks. Для Windows открываем в IDE файл wxWidgets - (путь_WXWIN)\include\wx\msw\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 скрипт, позволяющий частично автоматизировать подготовку и запуск процесса.

Сначала выполняется очистка результатов предыдущих попыток и удаляются каталоги с присутствующим файлом настроек 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:

lib = C:\codeblocks\wxWidgets-3.1.5\lib

Глобальный путь lib указываем к папке со статически линкуемым набором библиотек.


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

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


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


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

Сборка CodeBlocks

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

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

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

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

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

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

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

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


В списке проектов находим 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 Это работает

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

Компилятор для всех выполняемых работ должен быть один.

Версия компилятора должна быть актуальной и стабильной

Библиотека wxWidgets также должны быть актуальной.

Исходники codeblocks необходимо брать из репозитория.

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

Изменение системных переменных среды в загруженной IDE не обновляются, требуется ее перезапуск.

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