Разделы:

Главная

О проекте

Загрузки

Документация:

Linux

BSD

Другие Unix

Программинг

HTML, XML...

Сервера

"Окна Закрой!"

MANы

 


  

Программирование C++ на windows с использованием свободных средств разработки



О чем речь

Надоело. Надоело писать в неповоротливом (и дорогом :)) ЦБилдере. Надоели ограниченные, неудобные и устаревшие компоненты. Надоела неподконтрольность кода программы, а больше другого надоело вручную задавать одни и те же размеры одних и тех же кнопок. Мда. А может просто захотелось чего-то новенького. Ну и с GCC (GNU Compiler Collection), а точнее с G++, разобраться хотелось уже давно.

Для разработки программ одного компилятора мало, нужна еще среда какая-никакая, готовые классы, да и легальность выпуска своего коммерческого ПО совсем не помешает. В общем, потратил я на это неделю, а получилось вот что:


Введение

а смысл

Подробно

что такое GPL
настраиваем компилятор
среда разработки
набор классов


Ну и что я за это получу

1) бесплатную среду разработки (с исходниками, кстати)
2) нормально оптимизирующий компилятор, а не оптимизацию по версии извесных корпораций
3) набор мощных, удобных и хорошо написанных классов (с исходниками) для GUI, сети, ODBC, OpenGL и т.д.
4) возможность в будущем не напрягаясь перенести свои программы в другие ОС
5) да! да! да! наконец возможность забыть о ручном расположении компонентов на форме
6) возможность легально писать коммерческие приложения, не потратившись на среду
7) еще не тестировал, но теоретически - возможность линковать dll на С++, написанные для Microsoft Visual С (например, Oracle OCCI) (ЦБилдер не умеет этого делать по известной причине)

Подробно обо всех компонентах

Для начала нужно объяснить, что такое GPL (эта статья не является юридическим документом и для лучшего понимания необходимо читать оригинальные тексты упоминающихся здесь лицензий). GPL - GNU Public License - лицензия на использование программных продуктов. Смысл ее в том, чтобы не дать возможность отдельным лицам присвоить себе права на программное обеспечение, выпущенное по этой лицензии, и в то же время не мешать энтузиастам развивать его. Основные положения лицензии:
1) вновь создаваемое ПО, содержащее в себе хотя бы часть кода другого ПО, распространяемого по GPL, должно распространяться по GPL.
2) за GPL-ПО нельзя брать деньги. Можно только за распространение (стоимость носителя) или гарантийное обслуживание.
3) GPL-ПО распространяется с исходным кодом. Пользователь должен иметь возможность понять (путем изучения исходного кода) алгоритмы работы программы, изменять ее и компилировать.
Однако, все это не мешает использовать GPL-ПО для разработки коммерческого ПО, выпускаемого на любых условиях, если не использовать в нем исходный код GPL-ПО.
Русские тексты лицензий (GPL и LGPL) можно найти в ссылках.


Сердце нашей новой любимой среды
- компилятор языка C++. В этом качестве используем GCC. Что такое GCC? Это свободный (GPL) компилятор с нескольких языков (включая Java и C++), поддерживаемый на многих платформах. Развивается он довольно давно и отличается от привычных Borland и MSVC (кому что) лучшим качеством оптимизации кода по скорости и бОльшим временем компиляции. Про размер генерируемого кода у разных людей получаются разные результаты. Например, при компиляции небольшой dll, которая работает с OracleCallInterface, не использует vcl и string, GCC дает код размером 17кБ, против 58кБ у Билдера 5. Другой проект - визуальный, на чистом win32 api, без vcl - 55.5кБ против 68.5кБ, опять в пользу GCC. Однако, в инете я встречал упоминания, что GCC дает код бОльшего размера. Существует несколько вариантов получения GCC. Первый - скачать исходники и откомпилировать их чем-нибудь - не рекомендуется из-за своей сложности. Для windows существуют два бесплатных проекта, включающие в себя уже скомпилированный GCC, набор заголовочных файлов для windows и утилит: Cygwin и MinGW. Первый вариант более гибкий и мощный, но сложен в установке для тех, кто не работает с юниксоподобными системами. Я пока не нашел в себе сил в нем разобраться. Второй прост в установке, но, насколько я понял, с его помощью сложнее компилировать поставляемые в исходниках программы. Пока будем работать именно с ним. Итак, первое, что нам понадобится:

[1] MinGW и набор утилит к нему MSYS качаем с mingw.org (качать будем экзешники (.exe), а не исходники (.tar.gz) :)). Всего около 18МБ. Устанавливаем это дело и прописываем в path путь к каталогу mingw\bin (там лежит компилятор C++ g++.exe). Обратите внимание, что большинство проектов, распространяемых в исходниках, рекомендуют для компиляции утилиту make.exe (входит в MSYS), и запускать ее надо не из командной строки, а из оболочки MSYS, которая запускается из msys\1.0\msys.bat.
Если вы решите использовать Cygwin вместо MinGW, то его можно взять с cygwin.com.
Домашняя страница GCC gcc.gnu.org, там же документация по нему. Для работы MinGW или Cygwin отсюда ничего дополнительно качать не надо.

После установки MinGW, MSYS и прописывания path (не стоит использовать пути с пробелами) можно компилировать проекты, распространяемые в исходниках (для windows или многоплатформенные). Многие проекты включают описание настроек компиляции с помощью MinGW и Cygwin, и make-файлы для них. Компиляция в MinGW обычно выглядит так:
1) находим в проекте файл с описанием компиляции для windows с MinGW (например, install.txt)
2) выполняем указанные в описании изменения в указанном файле make.
3) запускаем msys.bat, переходим к каталогу, как указано в install.txt (msys - unix-like среда, и пути там надо писать с прямыми слэшами. Например, "cd /e/dev/wxwindows" для перехода к каталогу e:\dev\wxwindows).
4) запускаем отсюда же из msys make. Иногда с ключами, если указано в install, и ждем окончания компиляции и сборки.


Но компилировать проект руками не очень и удобно. Поэтому следующим номером идет среда разработки. Вообще сред для GCC под windows существует несколько штук (см. xraylith.wisc.edu), я остановился на DevCPP. Это бесплатная среда с открытым кодом (на Delphi), которая включает в себя редактор проекта, исходников, умеет работать с MinGW и отлаживать код с помощью отладчика GDB (включен в MinGW). В отличие от ЦБилдера, не включает в себя набор классов и среды создания интерфейса пользователя.

[2] DevCPP качаем с bloodshed.net (около 13.5МБ).
Устанавливаем, в настройках (Сервис/параметры компилятора) ставим:
компилятор/добавить следующие команды в запуск компилятора: -D__GNUWIN32__ -DHAVE_BOOL
каталоги/программы: добавляем каталоги MinGW\bin и MSYS\1.0\bin
каталоги/библиотеки: добавляем каталоги Dev-cpp\lib и MinGW\lib
каталоги/включаемые файли C++: добавляем каталоги Dev-cpp\include\c++, Dev-Cpp\include\c++\mingw32, Dev-Cpp\include\c++\backward, Dev-Cpp\include, MinGW\include

Теперь можно сделать и откомпилировать свой проект. Мне, например, удалось с минимальными переделками (в первом случае - в нескольких местах исходника поставить принудительное преобразование типа, во втором - подобрать ключ линковщика) скомпилировать win32 api проект (изначально сделан на ЦБилдере) и dll (там же).


Классы решают все. Без них ни туды и не сюды. Раньше приходилось пользоваться VCL (или MFC), теперь будем от этой пагубной привычки избавляться. Существует несколько свободных наборов классов на C++, которые на разных условиях можно использовать в своих разработках. Большой список классов (в основном для GUI) можно посмотреть на www.free-soft.org или (то же самое) на www.atai.org. Еще можно почитать xraylith.wisc.edu. После рассмотрения подходящих вариантов выбор был сделан в пользу двух наборов: FLTK и wxWindows (сейчас переименован в wxWidgets) (оба свободные и мультиплатформенные). Первый попроще, и в нем я не смог найти, например, grid, но с его помощью легче получить маленький размер программы (минимум около 150к, без каких либо ухищрений). Второй - мощнейшая вещь, включающая в себя поддержку online-помощи, работы с сетью, клипбоардом, drag and drop, multithreading, odbc, html, несколько форматов графических файлов, печать, контекст графического устройста, документ-вид, файлы, OpenGL, стандартные диалоги и т.д. В общем, чего там только нет. Для меня самым вкусным оказалось автоматическое расположение компонентов в окне при изменении размеров, мультиплатформенность и реализация класса string (wxString) с учетом минимизации расхода памяти (не дублируются одинаковые строки, если это допустимо) и минимизации количества перевыделений памяти при изменении строк. Вообще, классы в этом наборе написаны грамотно, мощно и удобно. Взять хоть wxGrid. TStringGrid (из VCL) с ним даже не сравнить. WxGrid мощнее THyperGrid, который к тому же неудобно программировать. Кроме того, wxWindows распространяется по лицензии Library GPL с дополнением - разрешением коммерческого использования без открытия исходников. К недостаткам wxWindows можно отнести большой минимальный размер программы, которая использует статическую линковку, а не dll, (хотя, это частично поправимо) - чуть больше мегабайта. Однако, чем больше ваш проект, тем меньше влияние на него классов wxWindows, потому что их размер не изменится - все равно будет около мегабайта.
Другие достоинства wxWindows - для него существует несколько визуальных сред создания интерфейсов. Интерфейс можно не "зашивать" в код программы, а хранить отдельно в виде ресурсного файла xml, который, соответственно, поддается редактированию без перекомпиляции программы. Кроме того, wxWindows существует не только для C++, но для Python (wxPython) и Perl (wxPerl).

[3] wxWindows в исходниках качаем с www.wxwindows.org (около 13МБ).
В порядке микротестирования wxString я ради интереса замерил скорость выполнения кода в комбинации:
ЦБилдер 5.0 vs wxWindows 2.4.2+MinGW 3.1.0.1:
1) для выяснения накладных расходов:
 long s=0;
 start();
 for(j=100000;j>0;j--)
 {
   for(int i=1000;i>0;i--)s=s+i;
 }
 end();
Здесь время выполнения практически одинаково (разница <10%). Время одной итерации - около 4e-09 сек.
2) основной код:
 ST s;
 start();
 for(j=1000;j>0;j--)
 {
   for(int i=1000;i>0;i--)s=s+'a';
   s="";
 }
 end();
где ST=String для ЦБилдер и ST=wxString для MinGW выполнялся в случае с wxString в 2.5 раза быстрее. Время одной итерации 3e-06 (ЦБилдер) и 1.2e-06 (MinGW), то есть накладные расходы на цикл пренебрежимо малы.

Перед использованием wxWindows надо скомпилировать. Инструкция и make-файлы в комплекте (wxWindows\docs\msw\install.txt). Я использовал mingw (раздел Cygwin/MinGW compilation в файле install.txt) и Using makefiles directly (ниже). Компилировать следует не отладочную, а финальную версию (раздел to compile with optimizations). Если есть желание, можно скомпилировать wxWindows в dll. В результате компиляции мы получим несколько объектных файлов в каталоге wxWindows\lib (с именами вида lib*.a), которые впоследствии нужно линковать к своему проекту. Еще нам нужны заголовочные файлы из wxWindows\include и описание wxWindows\docs\htmlhelp\wx.chm. После успешной компиляции wxWindows можно компилировать примеры из wxWindows\samples.

Инструменты для работы с wxWindows. Для меня самой полезной оказалось программа для создания GUI. Правда, в качестве инструмента для изучения wxWindows, а не написания программ. Эта программа - DialogBlocks. Разработка в ней завязана вокруг интерфейса, который можно "собрать" с помощью мышки, при этом сразу же генерируется C++ исходник. Она позволяет также связывать события с вызовом функций и добавлять свой C++ код. На выходе позволяет получить исходники на C++ или ресурсный файл XRC (xml файл описания интерфейса, формат которого поддерживается wxWindows). Программа платная. Вторая программа wxDesigner. Подобный визуальный редактор интерфейса. Умеет генерировать код не только C++, но Python, Perl и C#. Платный. Еще одна программа - wxWorkshop - задумана как мощный IDE, но, возможно, заброшена. На сегодня ценность ее сомнительна, хотя я с ней особо не разбирался - не хочится тратить время на последнюю версию от 2002 года.
В общем можно сказать, что полного и законченного IDE для wxWindows сегодня нет. Варианты разработки следующие:
- интерфейс: DialogBlocks или руками, благо второе с wxSizer делать нетрудно;
- код: DevCPP или любое средство работы с C++ исходниками или текстом (хоть CBuilder или VC);
- компиляция: DevCPP, другие IDE или вручную запуск g++;
- отладка: DevCPP или другие IDE.
Я пишу так: интерфейс руками, код и компиляция из своего собственного редактора (компилятор - g++), отладка на DevCPP. Кроме того, make-файл для компиляции тоже делается в DevCPP.

Дальше попозже...


Партнёры и спонсоры проекта:

Все материалы сайта распространяются по лицензии GNU/GPL
© ProUNIX 2003-2009, UnixLib 2005-2009, SoftLib 2006-2009.