Осваиваем wxWidgets: серия первая – установка под Windows.
September 21st, 2007 Begemot Posted in Программирование
“Ох, нелегкая это работа, из болота тащить бегемота” (с)
Скромная попытка описать свой опыт установки и начала работы с wxWidgets бесплатной кроссплатформенной библиотекой.
Последнии несколько дней имел длительный полов опыт сборки, установки и настройки этой библиотеки. Компиляции проектов под разными IDE, разными компиляторами, и в разных осях.
Все началось с того что я вновь (после двухмесячного перерыва) взялся осваивать wxWidget, с которой свзяваю надежды на долгое и плодотворное сотрудничество, а может даже и безбедную старость. В этот раз начал с того что выкачал и собрал новую версию – 2.8.5. После этого почему-то перестал собиратся мой тестовый проект. Вообщем меня это подтолкнуло к более глубокому разбирательству что и как нужно делать. После почти двух дней, возни благодаря помощи TRex’a, вроде как оно работает. Решил поделится результами, может кого-то избавит от граблей, а мне прибавит пару очков к карме
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 с поддержкой юникода. Вроде бы нечего плохого быть не должно, но я решил пока компилить без нее, на всякий случай
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… вообщем делаем вот что (краткое резюме для тех кто не хочет смотреть видео):
- Выбираем все файлы в дереве проектов и жмем alt-f7
- С++ -> 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, компиляция библиотеки и тестового приложения на линуксе. Вообщем прощаюсь не на долго
А пока курим:
- http://www.wxwidgets.org/wiki/index.php/Compiling_WxWidgets и оттуда по ссылкам…
- WxWidgets video tutorial
September 24th, 2007 at 7:18
опупеть… риалбейсик рулит 🙂
October 10th, 2007 at 6:00
Ага, REALbasic рулит (сам пользуюсь), но мне и wxWidgets нравится. Вот только все эти проблемы со сборкой… Ужас как неудобно.
October 10th, 2007 at 5:22
Niko – проекты в студию 🙂
Алексей, проблемы как я подозреваю только поначалу и только у таких тормозов как я, которые никогда ничего подобного не собирали и ленятся читать справку:) сейчас немного разобравшись и имея записанную последовательность действий – поставлю быстро. Хотя посмотрим, посмотрим мне скоро под мак ставить:)
Хотя теперь я знаю 1 хинт – можно поставить ДиалогБлокс – и там визуально выбрать опции нужные и он скомпилит.
October 10th, 2007 at 11:01
Кстати, да. Буквально вчера использовал DIalogBlocks для компиляции wxWidgets под Windows. Я скомпилировал с помощью Borland C++. Сборка прошла нормально, проекты приложений, созданных в DialogBlocks тоже в основном компилируются нормально, а сборка Samples из командной строки завершается неудачно.
Под Линуксом еще не пробовал. Мака пока, увы, нет, но очень хочется заиметь.
Кстати, есть хороший бесплатный аналог DialogBlocks. Называется wxFormBuilder. Он не такой фичастый, как DialogBlocks, но как редактор форм в общем очень даже ничего. Есть версия под Windows и под Linux, вроде бы есть неофициальная сборка под Мак. Они как раз сейчас озадачились улучшением поддержки Мака.
October 11th, 2007 at 1:30
>а сборка Samples из командной строки завершается неудачно.
А как саму библиотеку компилили. Я собирал статичиский юникодный билд, а все примеры которые там идут имеют проекты для shared ansi (если не путаю), ну вообщем перед тем как скомпилить проект необходимо менять его настройки сначала. Может поэтому с командной строки не собирается?
По поводу wxFormBuilder даже не знаю, я так медленно осваиваю новое:( Мне сильно хвалили ДиалогБлокс, как самые фичастый, самый лучший (все таки от автора библиотеки) и единственный который AUI поддерживает, вообщем сказали что своих денег стоит и на другие лучше не смотреть… Вот сейчас осваиваю его, освоюсь с ним и с самой библиотекой – попробую посмотреть на wxFormBuilder. Но wxGlade и wxSmith мне не особо понравились, хотя может я просто не понял – и надо было сначала хоть что-то ручками написать прежде чем их смотреть.
October 14th, 2007 at 11:28
Я вроде бы те же параметры указывал при компиляции примеров из командной строки, что и при компиляции библиотеки при помощи DialogBlocks (UNICODE=1, BUILD=release). Может быть, еще какие-то параметры надо было указать. Но вообще, скорее всего, именно в них все дело. Надо будет еще покопаться.
DialogBlocks действительно хорош, и AUI, скорее всего, только он поддерживает, да еще и custom classes. Вот если бы он еще генерировал не только C++, но и Python, цены бы ему не было!
wxGlade я использовал в одном простеньком проекте, который был написан на wxPython. Я им вопользовался, потому что он позволяет использовать custom classes. wxSmith я не очень внимательно рассматривал.
Кстати, Code::Blocks поддерживает и wxSmith, и wxFormBuilder. Раньше поддерживал только wxSmith.
October 15th, 2007 at 7:34
хм, посмотрел действительно диалог блокс питон не поддерживает напрямую, плохо:( Правда в хелпе есть
“Although DialogBlocks does not generate wxPython code, it’s straightforward to use the XRC files that DialogBlocks generates with your own wxPython programs.” но все равно это конечно не то что генерация питон кода.
Посмотрю wxFormBuilder, если не решу плюнуть на програмирования и уйти в онлайн проекты 🙂
October 15th, 2007 at 8:34
Да, XRC можно использовать и в C++, и в Python.
wxFormBuilder, как и DialogBlocks, генерирует код и в C++, и в XRC. Правда, авторы wxFormBuilder предупреждают, что в XRC можно сделать не все, что можно в XRC. Для табличного компонента, например, нет готовых XRC handlers.
November 10th, 2007 at 12:52
[…] же это мой первенец с новой для меня библиотекой wxWidgets. Если получится – портирую на макос и […]
December 1st, 2007 at 3:36
Привет, Николай!
Случайно наткнулся на Ваш блог в Гугле. Я имею небольшой опыт работы с wxWidgets, сделал пару небольших проектиков под Windows (VS 2003) и Suse Linux. Меня вот интересует следующая проблема.
Предположим, существует огромное количество программ на MFC, которые неплохо было бы портировать под wxWidgets. Сразу же возникает вопрос: файлы ресурсов под MFC и вообще под Windows API лежат в текстовых файлах специального формата (res), а для wxWidgets нужны ресурсы в XRC формате. Так вот, существует ли в природе конвертор RES-XRC?
С уважением
Дмитрий
December 2nd, 2007 at 6:45
Честно говоря я не так давно работаю с вхВ. Еще не специалист. но пока не встречал. Вообще в доке есть раздел по поводу перевода мфц приложения на вхВ, может быть там посмотреть.
December 29th, 2007 at 10:41
Доброго времени суток, Николай!
Понадобилось написать небольшой проект с использованием ui.
Смотрел в сторону mfc, но что-то не вдохновило:) К тому же хочется чтобы ui библиотека была кросс-платформенной и желательно open-source. wxWidget идеально подходит под описание:) Единственное после прочтения документации с оф. сервера остался один вопрос. Подскажите пожалуйста, необходимо ли устанавливать библиотеку wxWidget на том компьютере, на котором будет исполняться бинарник? или возможно в комплект с основной программой включить dll файл, реализующий функциональность библиотеки? Заранее спасибо за ответ.
P.S.
С наступающим НГ:)
December 29th, 2007 at 12:00
Нет, устанавливать не надо. Про вариант длл говорить не буду – не использовал, но думаю проблем нет. Я компилирую статически все – таким образом кроме ехе ничего не надо. В качестве примера можете глянуть http://blogovodstvo.com/ – это мой первенец на wxWidgets должен запустится без ничего по идее:)
Спасибо, вас так же!
May 10th, 2008 at 9:40
Началь изучать С++ и выбрал кодблокс тепер хучу создать приложения с 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 ===|
July 16th, 2008 at 10:49
[…] Ссылка на пост в моем основном блоге про установку wxwidgets под Windows для Visual Studio 2005, VC Express и MinGW. […]
October 9th, 2008 at 2:26
[…] Подход несколько отличается от того что писал я про установку wxWidgets. На мой взгляд не правилен так как используется анси […]
June 6th, 2010 at 5:28
Чтобы не мучиться со сборкой, можно попробовать wxPack. О нём есть статья на моём сайте: http://froexilize.com/article.php?id=4
August 8th, 2010 at 4:14
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, т.к. вся эта опенсорсная лабуда в моих кривых руках не работает.
August 26th, 2010 at 11:37
эта ошибка говорит о том, что либы собраны одной сборкой компилятора, а вы пользуетесь другой. т.е. dwarf2 и sjlj.