Попробовал 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 мне совсем не нравится…

Related:

Posted in Oбщее | Tags:

17 Responses to “Попробовал wxWidgets 3.0”

  1. Так какую версию ты пробовал – 3.0 или 2.9?
    На форуме ты говоришь, что устанавливал 2.9

  2. В данный момент 2.9 и 3.0 это одно и то же.

  3. С Unicode я вообще мало работал и C++ небольшой опыт. Но, по логике, конечно, приложение скомпилированное как Unicode будет больше по размеру (думаю процентов на 30) но ни как не в два раза. Поэтому возможно что то не так с параметрами компиляции.
    Кстати, кто нибудь пробовал анализировать размер одного и того же приложения в версии 2.8 если его скомпилировать как юникод и как ansi?

  4. Я когда собирал последний транк (где-то может пару месяцев назад), то тоже удивился резкому увеличению размера. Но мне тогда показалось, что это из-за нового gcc – я тогда одновременно перешел на офф. версию 4.4.0 с mingw сайта (до этого юзал сборку от tdm). Больше играться не стал с 2.9.х, т.к. надо было работать, поставил назад 2.8.10

  5. RomanV: С Unicode я вообще мало работал и C++ небольшой опыт. Но, по логике, конечно, приложение скомпилированное как Unicode будет больше по размеру (думаю процентов на 30) но ни как не в два раза. Поэтому возможно что то не так с параметрами компиляции.

    Я сравнивал юникодную версию 2.8.10 с юникодной версией 2.9,
    использовать ANSI уже много лет как дурной тон:)

  6. Н-да, не поленился, скачал собрал и посмотрел…
    Собрал под MinGW юникодовую статическую не монолитную библиотеку
    Пересобрал свою программу (в Code::Blocks) – с этим проблем не было вообще, собралось гладко, ничего не пришлось переделывать
    размер ощутимо увеличился: c 5 до 8 МБ
    А что хуже всего, слетели все русские буквы в программе. Вместо них пишется крякозябра типа когда в браузере пытаешься с кодировкой cp-1251 просмотреть юникодовую страничку.
    Причем слетели только буквы в конструкциях типа _(“по русски”), если использовать wxT(“по-русски”) все ОК.
    Будем разбираться

  7. Сергей
    А что хуже всего, слетели все русские буквы в программе. Вместо них пишется крякозябра типа когда в браузере пытаешься с кодировкой cp-1251 просмотреть юникодовую страничку.
    Причем слетели только буквы в конструкциях типа _(”по русски”), если использовать wxT(”по-русски”) все ОК.
    Будем разбираться

    Наверное это нормально, что слетели, т.к. в 2.9 надо использовать конструкции типа ”по-русски”, а не wxT(”по-русски”). т.е. просто писать строки.

  8. Как раз-таки не нормально что слетели в _(“”)..,
    Сергей, если что раскопаешь, отпишись плиз.

  9. RomanV: Наверное это нормально, что слетели, т.к. в 2.9 надо использовать конструкции типа ”по-русски”, а не wxT(”по-русски”). т.е. просто писать строки.

    а поподробнее об этом? Как тогда писать языковые модули? Раньше то _(“”) переводилось, а _T(“”) нет

  10. вот что раскопал в 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;
    }

    Итак, я запутался.
    Кстати и конструкция вида “по русски” тоже вызывает крякозябры…

  11. последнее, вообще говоря, вызывает подозрение, что проблема вообще глобальная – что то у них не то с юникодом?

  12. Наверное правильнее всего – контактировать разработчиков в их мэйл листе. И спросить у них это. Т.к. форум они похоже не читают.

  13. Этот блог, я думаю, они точно не читают. 🙂

  14. может уже поздно, но насколько я понял из описаний 2.9.0 – правильно не “по русски”, а L”по русски”
    тогда все будет хорошо. Это быстрое решение, если же надо еще и переводить, конечно конструкция _() – должна работать.
    кстати возможно там тоде самое надо сделать: _(L”по русски”) ?

  15. rs: кстати возможно там тоде самое надо сделать: _(L”по русски”) ?

    хм, попробую на досуге

  16. Немного поэксперементировал –
    http://begemotov.net/wxwidgets/common/stroki-v-wxwidgets-3-0/

  17. […] сидеть на строгой диете – что бы программы получались не такие большие. И только через пару минут (для отчета берем мои […]