Осваиваем wxWidgets: серия первая – установка под Windows.

September 21st, 2007 Begemot Posted in Программирование

“Ох, нелегкая это работа, из болота тащить бегемота” (с)

Скромная попытка описать свой опыт установки и начала работы с wxWidgets бесплатной кроссплатформенной библиотекой.

Последнии несколько дней имел длительный полов опыт сборки, установки и настройки этой библиотеки. Компиляции проектов под разными IDE, разными компиляторами, и в разных осях.

Все началось с того что я вновь (после двухмесячного перерыва) взялся осваивать wxWidget, с которой свзяваю надежды на долгое и плодотворное сотрудничество, а может даже и безбедную старость. В этот раз начал с того что выкачал и собрал новую версию – 2.8.5. После этого почему-то перестал собиратся мой тестовый проект. Вообщем меня это подтолкнуло к более глубокому разбирательству что и как нужно делать. После почти двух дней, возни благодаря помощи TRex’a, вроде как оно работает. Решил поделится результами, может кого-то избавит от граблей, а мне прибавит пару очков к карме[Image]

Disclaimer: все что описанно ниже это не правильный вариант установки и настройки wxWidgets, а просто вариант который заработал у меня.

 

Компилируем wxWidgets под Windows.

Решив перейти с MFC на wxW я решил заодно и сменить студию на Code::Blocks. Он бесплатен, os, написан на wxW соответственно есть версия для как для винды так и для линукса (а так же неофициальные билды для MAC OS) – все таки работать в одной среде под разными ОС вместо двух разных мне кажется удобнее. Для Code::Blocks скачал и поставил компилятор MinGW (Хотя сама среда поддерживает практически любой компилятор который вы захотите). Решите попробывать Code::Blocks – ставьте только ночной билд (искать на форуме), но не официальный RC2.

Качаем исходники wxWidgets, достаем из архива и ложим на постоянное место жительства (у меня в пике занято было почти 2Гига места, учтите), у меня это E:\Const\wxWidgets-2.8.5\. Смотрим нет ли патчей на самую свежею версию, на 2.8.5 уже есть один – качаем и ставим.

Собираем wxWidgets с использование MinGW.

Читаем INSTALL-MSW.txt в корневом каталоге. дальше компилируем с помощью make файла, идем в E:\Const\wxWidgets-2.8.5\build\msw\ и выполняем

mingw32-make -f makefile.gcc BUILD=debug UNICODE=1

Остальные опции остаются по умолчанию, минут через 10 получаем статическую не монолитную юникодную дебаг версию библиотеки. Дальше меняем debug на release (BUILD=release) и получаем релиз версию.

Еще есть опция MSLU=1 судя по хелпу включает поддержку Microsoft Layer for Unicode, в этом случае можно будет собирать приложения для работы под 98 с поддержкой юникода. Вроде бы нечего плохого быть не должно, но я решил пока компилить без нее, на всякий случай[Image]

Visual Studio 2005 или VC Express.

В принципе Code::Blocks производит достаточно приятное впечетление, за исключением одной вещи. У меня возникло чуство что юниксовский дебагер gdb – не совсем отвечает моим представлениям об удобстве и функциональности хорошего дебагера (мы молодежь развращенны Visual Studio). Правда говорят можно прикрутить дебагер от MS, незнаю, пока не пробывал. И я стал смотреть в сторону VC Express: Лицензионно чисто так как бесплатно(и даже Visual Assist не нужен), и по слухам довольно удобно, и главное отладчик хороший:). Вообщем я решил что ничего плохого не будет если под виндой я возможно буду работать в экспрессе. Хотя я его только сегодня поставил и еще совсем не опредился что же будет использоватся как основное IDE.

Открываем проект E:\Const\wxWidgets-2.8.5\build\msw\wx.dsw, конвертим его в новый формат. Дальше есть два пути первый просто скомпилить все проекты как предлагают разработчики библиотеке, второй – изменить динамическую линковку на статическую как предлагает TRex в своих видео-туториалах по сборке wxWidgets и настройке разных IDE. По слухам второй вариант лучше так как генерируемые ехе гарантированно работают везде, хотя расплачиваться за это приходится увеличенным размером файла. Так как у меня уже был печальный опыт с динамической линковкой MFC… вообщем делаем вот что (краткое резюме для тех кто не хочет смотреть видео):

  1. Выбираем все файлы в дереве проектов и жмем alt-f7
  2. С++ -> Code Generation -> Runtime Library -> меняем /MD на /MT для релиза и /MDd на /MTd для дебага.

Имейте ввиду что менять нужно для нужной вам конфигурации, я себе собирал статическую юникодную версию (Unicode Debug и Unicode Release) именно для них и меняем. Собираем оба варианта.

Дальше копируем файл include/wx/msw/setup.h в include/wx/setup.h

Не забываем прописать в VC++ Directories $(WXWIN)/include и $(WXWIN)/lib/vc_lib.

Вроде ничего не забыл.

Очистка

После всего этого папка с wxWidgets занимает 1.5+G. Проблемой очистки я заинтересовался, когда хотел рядом с 2.8.4, поставить параллельно 2.8.5. Первый вариант был такой

del /S *.obj,*.res;*.pch;*.pdb;*.tlb;*.idb;*.ilk;*.opt;*ncb;*.sbr;*.sup;*.bsc;*.o

В корневом каталоге вхВ. Удаляем все временные файлы VC компилятора и *.o для MinGW. Вариант оказался неудачным посколько *.pdb точно нужны для отладки, а *.manifest и некоторые другие расширения присутсвуют в самой поставки wxWidgets.

Второй раз я был более осторожен и решил удалить только папки vc_mswud и vc_mswu в E:\Const\wxWidgets-2.8.5\build\msw\.Там лежат obj и pch, которые занимают дофига места (600 метров). Я не совсем уверен хорошая ли это идея убить pcompiled headers – так как слегда слаб в теории, но рискнул. Также в корзину идет wx.ncb расположенный чуть выше.

Что чистить после MinGW? Точно не знаю, в папке E:\Const\wxWidgets-2.8.5\build\msw\gcc_mswud и gcc_mswu я вижу только *.o и *.o.d файлы. Что это в гугле я не нашел (ужас!). Но эксперементальным путем выяснил что удаление этих двух папок, ни компиляции ни отладки тестового проекта не мешает, зато прибаляет нам 400 метров.

И так: удаляем в папке E:\Const\wxWidgets-2.8.5\build\ файл wx.ncb, и подпапки gcc_mswud, gcc_mswu, vc_mswud и vc_mswu. В итоге все занимает 680 метров, из котрых 600 это либы которые мы только что скомпилили и отладочная инфорация, остальное исходники и скрпиты компиляции. Вообщем ничего лишнего.

Пока все. Но в переди еще настройка проектов для VC Express и Code::Blocks with MinGW, компиляция библиотеки и тестового приложения на линуксе. Вообщем прощаюсь не на долго[Image]

А пока курим:


Если вам понравился этот пост вы можете подписаться на RSS или мы можем доставлять вам новые посты прямо в ваш почтовый ящик.

Related:

19 Responses to “Осваиваем wxWidgets: серия первая – установка под Windows.”

  1. опупеть… риалбейсик рулит 🙂

  2. Ага, REALbasic рулит (сам пользуюсь), но мне и wxWidgets нравится. Вот только все эти проблемы со сборкой… Ужас как неудобно.

  3. Niko – проекты в студию 🙂

    Алексей, проблемы как я подозреваю только поначалу и только у таких тормозов как я, которые никогда ничего подобного не собирали и ленятся читать справку:) сейчас немного разобравшись и имея записанную последовательность действий – поставлю быстро. Хотя посмотрим, посмотрим мне скоро под мак ставить:)
    Хотя теперь я знаю 1 хинт – можно поставить ДиалогБлокс – и там визуально выбрать опции нужные и он скомпилит.

  4. Кстати, да. Буквально вчера использовал DIalogBlocks для компиляции wxWidgets под Windows. Я скомпилировал с помощью Borland C++. Сборка прошла нормально, проекты приложений, созданных в DialogBlocks тоже в основном компилируются нормально, а сборка Samples из командной строки завершается неудачно.

    Под Линуксом еще не пробовал. Мака пока, увы, нет, но очень хочется заиметь.

    Кстати, есть хороший бесплатный аналог DialogBlocks. Называется wxFormBuilder. Он не такой фичастый, как DialogBlocks, но как редактор форм в общем очень даже ничего. Есть версия под Windows и под Linux, вроде бы есть неофициальная сборка под Мак. Они как раз сейчас озадачились улучшением поддержки Мака.

  5. >а сборка Samples из командной строки завершается неудачно.

    А как саму библиотеку компилили. Я собирал статичиский юникодный билд, а все примеры которые там идут имеют проекты для shared ansi (если не путаю), ну вообщем перед тем как скомпилить проект необходимо менять его настройки сначала. Может поэтому с командной строки не собирается?

    По поводу wxFormBuilder даже не знаю, я так медленно осваиваю новое:( Мне сильно хвалили ДиалогБлокс, как самые фичастый, самый лучший (все таки от автора библиотеки) и единственный который AUI поддерживает, вообщем сказали что своих денег стоит и на другие лучше не смотреть… Вот сейчас осваиваю его, освоюсь с ним и с самой библиотекой – попробую посмотреть на wxFormBuilder. Но wxGlade и wxSmith мне не особо понравились, хотя может я просто не понял – и надо было сначала хоть что-то ручками написать прежде чем их смотреть.

  6. Я вроде бы те же параметры указывал при компиляции примеров из командной строки, что и при компиляции библиотеки при помощи DialogBlocks (UNICODE=1, BUILD=release). Может быть, еще какие-то параметры надо было указать. Но вообще, скорее всего, именно в них все дело. Надо будет еще покопаться.

    DialogBlocks действительно хорош, и AUI, скорее всего, только он поддерживает, да еще и custom classes. Вот если бы он еще генерировал не только C++, но и Python, цены бы ему не было!

    wxGlade я использовал в одном простеньком проекте, который был написан на wxPython. Я им вопользовался, потому что он позволяет использовать custom classes. wxSmith я не очень внимательно рассматривал.

    Кстати, Code::Blocks поддерживает и wxSmith, и wxFormBuilder. Раньше поддерживал только wxSmith.

  7. хм, посмотрел действительно диалог блокс питон не поддерживает напрямую, плохо:( Правда в хелпе есть
    “Although DialogBlocks does not generate wxPython code, it’s straightforward to use the XRC files that DialogBlocks generates with your own wxPython programs.” но все равно это конечно не то что генерация питон кода.
    Посмотрю wxFormBuilder, если не решу плюнуть на програмирования и уйти в онлайн проекты 🙂

  8. Да, XRC можно использовать и в C++, и в Python.

    wxFormBuilder, как и DialogBlocks, генерирует код и в C++, и в XRC. Правда, авторы wxFormBuilder предупреждают, что в XRC можно сделать не все, что можно в XRC. Для табличного компонента, например, нет готовых XRC handlers.

  9. […] же это мой первенец с новой для меня библиотекой wxWidgets. Если получится – портирую на макос и […]

  10. Привет, Николай!

    Случайно наткнулся на Ваш блог в Гугле. Я имею небольшой опыт работы с wxWidgets, сделал пару небольших проектиков под Windows (VS 2003) и Suse Linux. Меня вот интересует следующая проблема.
    Предположим, существует огромное количество программ на MFC, которые неплохо было бы портировать под wxWidgets. Сразу же возникает вопрос: файлы ресурсов под MFC и вообще под Windows API лежат в текстовых файлах специального формата (res), а для wxWidgets нужны ресурсы в XRC формате. Так вот, существует ли в природе конвертор RES-XRC?

    С уважением

    Дмитрий

  11. Честно говоря я не так давно работаю с вхВ. Еще не специалист. но пока не встречал. Вообще в доке есть раздел по поводу перевода мфц приложения на вхВ, может быть там посмотреть.

  12. Доброго времени суток, Николай!
    Понадобилось написать небольшой проект с использованием ui.
    Смотрел в сторону mfc, но что-то не вдохновило:) К тому же хочется чтобы ui библиотека была кросс-платформенной и желательно open-source. wxWidget идеально подходит под описание:) Единственное после прочтения документации с оф. сервера остался один вопрос. Подскажите пожалуйста, необходимо ли устанавливать библиотеку wxWidget на том компьютере, на котором будет исполняться бинарник? или возможно в комплект с основной программой включить dll файл, реализующий функциональность библиотеки? Заранее спасибо за ответ.
    P.S.
    С наступающим НГ:)

  13. Нет, устанавливать не надо. Про вариант длл говорить не буду – не использовал, но думаю проблем нет. Я компилирую статически все – таким образом кроме ехе ничего не надо. В качестве примера можете глянуть http://blogovodstvo.com/ – это мой первенец на wxWidgets должен запустится без ничего по идее:)
    Спасибо, вас так же!

  14. Началь изучать С++ и выбрал кодблокс тепер хучу создать приложения с WXWidgets но при компиляцие выдается ощибка

    Закачал пару видео уроков, не помогает

    В чем дело? Немонимаю!

    ||=== wxtest, Debug ===|
    obj\Debug\wxtestApp.o||In function `_ZN9wxtestAppD0Ev’:|
    C:\CodeBlocks\CBlocks\wxtest\wxtestApp.cpp:(.text+0x45)||undefined reference to `__imp___ZN12wxAppConsole17CheckBuildOptionsEPKcS1_’|
    obj\Debug\wxtestApp.o||In function `WinMain’:|
    C:\CodeBlocks\CBlocks\wxtest\wxtestApp.cpp|287|undefined reference to `__imp___Z7wxEntryP11HINSTANCE__S0_Pci’|
    obj\Debug\wxtestApp.o||In function `_ZN9wxtestApp6OnInitEv’:|
    C:\CodeBlocks\CBlocks\wxtest\wxtestApp.cpp|26|undefined reference to `__imp___ZN6wxIconC1ERK8wxStringlii’|
    obj\Debug\wxtestApp.o||In function `_ZN9wxtestAppD0Ev’:|
    C:\CodeBlocks\CBlocks\wxtest\wxtestApp.cpp:(.text$_ZN9wxtestAppC1Ev[wxtestApp::wxtestApp()]+0xd)||undefined reference to `__imp___ZN5wxAppC2Ev’|
    C:\CodeBlocks\CBlocks\wxtest\wxtestApp.cpp:(.text$_ZN12wxAppConsole11GetInstanceEv[wxAppConsole::GetInstance()]+0x4)||undefined reference to `__imp___ZN12wxAppConsole14ms_appInstanceE’|
    )]+0x7)||undefined reference to `__imp___ZN12wxStringBase4nposE’|
    )]+0x27)||undefined reference to `__imp___ZN12wxStringBase8InitWithEPKcjj’|
    )]+0x7)||undefined reference to `__imp___Z11wxGetLocalev’|
    C:\CodeBlocks\CBlocks\wxtest\wxtestApp.cpp:(.rdata$_ZTV9wxtestApp[vtable for wxtestApp]+0x44)||undefined reference to `wxApp::Initialize(int&, char**)’|
    )())]+0x5)||undefined reference to `__imp___ZN12wxAppConsole12ms_appInitFnE’|
    C:\CodeBlocks\CBlocks\wxtest\wxtestApp.cpp:(.text$_ZN9wxtestAppD1Ev[wxtestApp::~wxtestApp()]+0x16)||undefined reference to `__imp___ZN5wxAppD2Ev’|
    C:\CodeBlocks\CBlocks\wxtest\wxtestApp.cpp:(.text$_ZN9wxtestAppD0Ev[wxtestApp::~wxtestApp()]+0x16)||undefined reference to `__imp___ZN5wxAppD2Ev’|
    obj\Debug\wxtestMain.o||In function `_ZN11wxtestFrameC2EP7wxFrameRK8wxString’:|
    C:\CodeBlocks\CBlocks\wxtest\wxtestMain.cpp|56|undefined reference to `__imp__wxFrameNameStr’|
    C:\CodeBlocks\CBlocks\wxtest\wxtestMain.cpp|56|undefined reference to `__imp__wxDefaultSize’|
    C:\CodeBlocks\CBlocks\wxtest\wxtestMain.cpp|56|undefined reference to `__imp__wxDefaultPosition’|
    C:\CodeBlocks\CBlocks\wxtest\wxtestMain.cpp|59|undefined reference to `__imp___ZN9wxMenuBarC1Ev’|
    C:\CodeBlocks\CBlocks\wxtest\wxtestMain.cpp|73|undefined reference to `__imp__wxStatusLineNameStr’|
    C:\CodeBlocks\CBlocks\wxtest\wxtestMain.cpp|75|undefined reference to `__imp___ZN7wxFrameD2Ev’|
    obj\Debug\wxtestMain.o||In function `_ZN11wxtestFrameC1EP7wxFrameRK8wxString’:|
    C:\CodeBlocks\CBlocks\wxtest\wxtestMain.cpp|56|undefined reference to `__imp__wxFrameNameStr’|
    C:\CodeBlocks\CBlocks\wxtest\wxtestMain.cpp|56|undefined reference to `__imp__wxDefaultSize’|
    C:\CodeBlocks\CBlocks\wxtest\wxtestMain.cpp|56|undefined reference to `__imp__wxDefaultPosition’|
    C:\CodeBlocks\CBlocks\wxtest\wxtestMain.cpp|59|undefined reference to `__imp___ZN9wxMenuBarC1Ev’|
    C:\CodeBlocks\CBlocks\wxtest\wxtestMain.cpp|73|undefined reference to `__imp__wxStatusLineNameStr’|
    C:\CodeBlocks\CBlocks\wxtest\wxtestMain.cpp|75|undefined reference to `__imp___ZN7wxFrameD2Ev’|
    obj\Debug\wxtestMain.o||In function `_ZN11wxtestFrameD2Ev’:|
    C:\CodeBlocks\CBlocks\wxtest\wxtestMain.cpp|82|undefined reference to `__imp___ZN7wxFrameD2Ev’|
    obj\Debug\wxtestMain.o||In function `_ZN11wxtestFrameD1Ev’:|
    C:\CodeBlocks\CBlocks\wxtest\wxtestMain.cpp|82|undefined reference to `__imp___ZN7wxFrameD2Ev’|
    obj\Debug\wxtestMain.o||In function `_ZN11wxtestFrameD0Ev’:|
    C:\CodeBlocks\CBlocks\wxtest\wxtestMain.cpp|82|undefined reference to `__imp___ZN7wxFrameD2Ev’|
    obj\Debug\wxtestMain.o||In function `_ZN11wxtestFrame7OnAboutER14wxCommandEvent’:|
    C:\CodeBlocks\CBlocks\wxtest\wxtestMain.cpp|98|undefined reference to `__imp___Z12wxMessageBoxRK8wxStringS1_lP8wxWindowii’|
    obj\Debug\wxtestMain.o||In function `_Z41__static_initialization_and_destruction_0ii’:|
    C:\CodeBlocks\CBlocks\wxtest\wxtestMain.cpp|48|undefined reference to `__imp___ZN7wxFrame13sm_eventTableE’|
    C:\CodeBlocks\CBlocks\wxtest\wxtestMain.cpp|48|undefined reference to `__imp___ZN16wxEventHashTableC1ERK12wxEventTable’|
    C:\CodeBlocks\CBlocks\wxtest\wxtestMain.cpp|52|undefined reference to `__imp__wxEVT_CLOSE_WINDOW’|
    C:\CodeBlocks\CBlocks\wxtest\wxtestMain.cpp|52|undefined reference to `__imp__wxEVT_COMMAND_MENU_SELECTED’|
    C:\CodeBlocks\CBlocks\wxtest\wxtestMain.cpp|52|undefined reference to `__imp__wxEVT_COMMAND_MENU_SELECTED’|
    C:\CodeBlocks\CBlocks\wxtest\wxtestMain.cpp|52|undefined reference to `__imp__wxEVT_NULL’|
    C:\CodeBlocks\CBlocks\wxtest\wxtestMain.cpp|48|undefined reference to `__imp___ZN16wxEventHashTableD1Ev’|
    obj\Debug\wxtestMain.o||In function `_ZNK12wxWindowBase7IsShownEv’:|
    )]+0x22)||undefined reference to `__imp___ZN12wxStringBase10ConcatSelfEjPKcj’|
    wxItemKind)]+0x31)||undefined reference to `__imp___ZN14wxMenuItemBase3NewEP6wxMenuiRK8wxStringS4_10wxItemKindS1_’|
    long)]+0x59)||undefined reference to `__imp___ZTV6wxMenu’|
    long)]+0x7e)||undefined reference to `__imp___ZN6wxMenu4InitEv’|
    long)]+0xcc)||undefined reference to `__imp___ZN10wxMenuBaseD2Ev’|
    C:\CodeBlocks\wxWidgets\include\wx\window.h:(.text$_ZN18wxAcceleratorArrayD1Ev[wxAcceleratorArray::~wxAcceleratorArray()]+0xd)||undefined reference to `__imp___ZN18wxBaseArrayPtrVoidD2Ev’|
    C:\CodeBlocks\wxWidgets\include\wx\window.h:(.text$_ZN18wxAcceleratorArrayC1Ev[wxAcceleratorArray::wxAcceleratorArray()]+0xd)||undefined reference to `__imp___ZN18wxBaseArrayPtrVoidC2Ev’|
    long)]+0x3c)||undefined reference to `__imp___ZN12wxEvtHandlerC2Ev’|
    long)]+0x4d)||undefined reference to `__imp___ZTV10wxMenuBase’|
    long)]+0x9d)||undefined reference to `__imp___ZN10wxMenuBase4InitEl’|
    obj\Debug\wxtestMain.o||In function `_ZN11wxtestFrameC2EP7wxFrameRK8wxString’:|
    C:\CodeBlocks\CBlocks\wxtest\wxtestMain.cpp|55|undefined reference to `__imp___ZN12wxEvtHandlerD2Ev’|
    obj\Debug\wxtestMain.o||In function `_ZNK12wxWindowBase7IsShownEv’:|
    C:\CodeBlocks\wxWidgets\include\wx\window.h:(.text$_ZN14wxMenuItemListD1Ev[wxMenuItemList::~wxMenuItemList()]+0x16)||undefined reference to `__imp___ZN10wxListBaseD2Ev’|
    C:\CodeBlocks\wxWidgets\include\wx\window.h:(.text$_ZN10wxListBaseC2E9wxKeyType[wxListBase::wxListBase(wxKeyType)]+0x44)||undefined reference to `__imp___ZTV10wxListBase’|
    C:\CodeBlocks\wxWidgets\include\wx\window.h:(.text$_ZN10wxListBaseC2E9wxKeyType[wxListBase::wxListBase(wxKeyType)]+0x5b)||undefined reference to `__imp___ZN10wxListBase4InitE9wxKeyType’|
    C:\CodeBlocks\wxWidgets\include\wx\window.h:(.text$_ZN8wxObjectD2Ev[wxObject::~wxObject()]+0xa)||undefined reference to `__imp___ZTV8wxObject’|
    ||More errors follow but not being shown.|
    ||Edit the max errors limit in compiler options…|
    ||=== Build finished: 50 errors, 0 warnings ===|

  15. […] Ссылка на пост в моем основном блоге про установку wxwidgets под Windows для Visual Studio 2005, VC Express и MinGW. […]

  16. […] Подход несколько отличается от того что писал я про установку wxWidgets. На мой взгляд не правилен так как используется анси […]

  17. Чтобы не мучиться со сборкой, можно попробовать wxPack. О нём есть статья на моём сайте: http://froexilize.com/article.php?id=4

  18. wxPack (v2.8.10.06) и codeblocks (10:50) не дружат между собой. При попытке компиляции проекта вываливается куча ошибок вида:
    C:\wxWidgets2.8\lib\gcc_lib\libwxmsw28_core.a(corelib_app.o):app.cpp|| undefined reference to `_Unwind_Resume’|

    Чувствую, всёже буду использовать MS Visual Studio Express, т.к. вся эта опенсорсная лабуда в моих кривых руках не работает.

  19. эта ошибка говорит о том, что либы собраны одной сборкой компилятора, а вы пользуетесь другой. т.е. dwarf2 и sjlj.