Попробовал wxWidgets 3.0
August 20th, 2009 Begemot Posted in Oбщее
Вернее конечно еще не саму 3.0, а то, что ей скоро станет – текущее состояние сорцов из транка. Выкачал из репозитория, собрал библиотеку, собрал свою программу. Теперь у меня есть две новости – плохая и хорошая 🙂
Есть у меня программа которая не делает ничего супер специфического, но поддерживает достаточно много базовых, для любой нормальной программы, вещей. Вопреки ожиданиям, удалось достаточно быстро ее скопмилироват. Нашлось только одно место где у функции поменялись параметры и пришлось переделывать код и всего два места, в которых используются deprecated function. В общем ничего серьозного, за 20 минут скомпилил программу даже с выключенным режимом совместимости. Это радует.
Теперь то, что огорчает – размер ехешника вырос почти в два раза с 1.8М до 3.4 в релизе, и до 7M в дебаг версии. Minimal sampe из поставки wxWidgets компилируется в 4.5М кода в релизе (!). С такими делами уже и на QT можно переходить:(
Настройки для сборки wxWidgets я использую стандартные, с одним исключением – меню динамическую сборку на статическую – (/MD(d) -> /MT(d)). Статическую сборку я использую всегда для уменьшения проблем у пользователей.
Спросил на wxForum – все молчат. Но что-то такой располневший exe мне совсем не нравится…
August 21st, 2009 at 10:50 am
Так какую версию ты пробовал – 3.0 или 2.9?
На форуме ты говоришь, что устанавливал 2.9
August 21st, 2009 at 10:58 am
В данный момент 2.9 и 3.0 это одно и то же.
August 21st, 2009 at 11:27 am
С Unicode я вообще мало работал и C++ небольшой опыт. Но, по логике, конечно, приложение скомпилированное как Unicode будет больше по размеру (думаю процентов на 30) но ни как не в два раза. Поэтому возможно что то не так с параметрами компиляции.
Кстати, кто нибудь пробовал анализировать размер одного и того же приложения в версии 2.8 если его скомпилировать как юникод и как ansi?
August 21st, 2009 at 1:40 pm
Я когда собирал последний транк (где-то может пару месяцев назад), то тоже удивился резкому увеличению размера. Но мне тогда показалось, что это из-за нового gcc – я тогда одновременно перешел на офф. версию 4.4.0 с mingw сайта (до этого юзал сборку от tdm). Больше играться не стал с 2.9.х, т.к. надо было работать, поставил назад 2.8.10
August 25th, 2009 at 8:51 am
Я сравнивал юникодную версию 2.8.10 с юникодной версией 2.9,
использовать ANSI уже много лет как дурной тон:)
August 25th, 2009 at 11:53 pm
Н-да, не поленился, скачал собрал и посмотрел…
Собрал под MinGW юникодовую статическую не монолитную библиотеку
Пересобрал свою программу (в Code::Blocks) – с этим проблем не было вообще, собралось гладко, ничего не пришлось переделывать
размер ощутимо увеличился: c 5 до 8 МБ
А что хуже всего, слетели все русские буквы в программе. Вместо них пишется крякозябра типа когда в браузере пытаешься с кодировкой cp-1251 просмотреть юникодовую страничку.
Причем слетели только буквы в конструкциях типа _(“по русски”), если использовать wxT(“по-русски”) все ОК.
Будем разбираться
August 26th, 2009 at 12:35 am
Наверное это нормально, что слетели, т.к. в 2.9 надо использовать конструкции типа ”по-русски”, а не wxT(”по-русски”). т.е. просто писать строки.
August 26th, 2009 at 7:37 am
Как раз-таки не нормально что слетели в _(“”)..,
Сергей, если что раскопаешь, отпишись плиз.
August 26th, 2009 at 9:01 am
а поподробнее об этом? Как тогда писать языковые модули? Раньше то _(“”) переводилось, а _T(“”) нет
August 27th, 2009 at 10:32 pm
вот что раскопал в intl.h
// get the translation of the string in the current locale
inline const wxString& wxGetTranslation(const wxString& str,
const wxString& domain = wxEmptyString)
{
wxLocale *pLoc = wxGetLocale();
if (pLoc)
return pLoc->GetString(str, domain);
else
// NB: this function returns reference to a string, so we have to keep
// a copy of it somewhere
return wxLocale::GetUntranslatedString(str);
}
2.8 возвращает при невозможности перевода непосредственно саму строку, а тут wxLocale::GetUntranslatedString(str). Эта функция по моему и работает не совсем корректно
Это уже в intl.cpp
const wxString& wxLocale::GetUntranslatedString(const wxString& str)
{
static wxLocaleUntranslatedStrings s_strings;
wxLocaleUntranslatedStrings::iterator i = s_strings.find(str);
if ( i == s_strings.end() )
return *s_strings.insert(str).first;
return *i;
}
Итак, я запутался.
Кстати и конструкция вида “по русски” тоже вызывает крякозябры…
August 27th, 2009 at 10:33 pm
последнее, вообще говоря, вызывает подозрение, что проблема вообще глобальная – что то у них не то с юникодом?
August 27th, 2009 at 11:31 pm
Наверное правильнее всего – контактировать разработчиков в их мэйл листе. И спросить у них это. Т.к. форум они похоже не читают.
August 28th, 2009 at 7:19 pm
Этот блог, я думаю, они точно не читают. 🙂
September 9th, 2009 at 6:01 pm
может уже поздно, но насколько я понял из описаний 2.9.0 – правильно не “по русски”, а L”по русски”
тогда все будет хорошо. Это быстрое решение, если же надо еще и переводить, конечно конструкция _() – должна работать.
кстати возможно там тоде самое надо сделать: _(L”по русски”) ?
September 11th, 2009 at 11:02 am
хм, попробую на досуге
September 11th, 2009 at 3:38 pm
Немного поэксперементировал –
http://begemotov.net/wxwidgets/common/stroki-v-wxwidgets-3-0/
September 14th, 2009 at 12:32 am
[…] сидеть на строгой диете – что бы программы получались не такие большие. И только через пару минут (для отчета берем мои […]