Кракозябры в выводе компилятора



  • Всем привет!

    Поставил последнюю версию Creator на Win8.
    На этапе сборки, компилятор выдает ошибки, но прочесть их невозможно:

    ошибка: C2143: бЁ­в ЄбЁзҐбЄ п ®иЁЎЄ : ®вбгвбвўЁҐ ")" ЇҐаҐ¤ ";"

    Как с этим бороться?

    Спасибо!



  • Что за компилятор?
    У Вас компилятор русифицированный, соответсвенно, выдает текст либо в кодировке CP1251, либо в UTF. Соответсвенно, консоль у QtCreator настроена на другую кодировку. Самое простое решение на мой взляд - использовать нормальный, англоязычный компилятор



  • Пока затрудняюсь ответить. У меня стоит Visual Studio 2013, недавно накатил Qt... Соответственно, ставил все из коробки...



  • На первой же странице google при запросе "русифицированный компилятор Qt Creator", можно найти возможное решение проблемы.
    Например, вот тут пишут, что компилятор VC выдает результат в старой кодировке DOS(866). Попроубуйте такое решение:

    FresherTM
    23.1.2015 20:39
    Есть способ без замены бинарника и с русскими комментариями:
    пишем .bat файл примерно следующего содержания:

    @echo off
    chcp 1251 > nul
    C:\path\to\jom.exe %*

    В QtCreator в настройках проекта заменяем путь к jom.exe на путь к нашему .bat файлу.

    Еще можно попробовать использовать компилятор MinGW вместо VC



  • Что-то не могу найти, где путь к jom выставляется =(



  • Я сейчас не работаю под Windows, поэтому могу только догадаться - попробуй посмотреть в Projects->Build & Run->Build Steps.
    И не забывай, что есть google



  • Еще Tools->Options->Build & Run



  • Проблема в том что Qt Creator свои сообщения выводит в кодировке 1251, а cl.exe из Visual Studio в кодировке 866. Соответственно решений несколько. Например:

    1. Заставить выводить cl.exe сообщения об ошибках на английском языке (часто проще найти в интернете обсуждение подобных ошибок именно на английском, чем на русском). Для этого либо переустановить Visual Studio на английскую версию, либо найти в каталоге где она установлена файл VC/bin/1049/clui.dll и заменить его на английскую версию (можно найти например на my-dll.com)

    2. Заменить кодировку по умолчанию для консоли. Для этого ищем в реестре все параметры OEMCP и меняем их значения с 866 на 1251, и устанавливаем в HKEY_CURRENT_USER/Console для FaceName значение Lucida Console, а для FontFamily значение 0x00000036

    3. Перекодировать вывод cl.exe в нужную кодировку. Для этого компилируем простенькую программку:

    main.cpp:

    #include <QCoreApplication>
    #include <QProcess>
    #include <stdio.h>
    #include "main.h"
    
    void Main::start(int argc, char **argv)
    {
        decoder = QTextCodec::codecForName("IBM866");
        encoder = QTextCodec::codecForName("WINDOWS-1251");
        proc.setProgram("cl_real.exe");
        QStringList args;
        for (int i = 1; i < argc; ++i) {
            args << QString::fromLocal8Bit(argv[i]);
        }
        proc.setArguments(args);
        connect(&proc, SIGNAL(readyReadStandardError()),
                this, SLOT(readStdErr()));
        connect(&proc, SIGNAL(readyReadStandardOutput()),
                this, SLOT(readStdOut()));
        connect(&proc, SIGNAL(finished(int,QProcess::ExitStatus)),
                this, SLOT(onExit(int)));
        proc.start();
    }
    
    void Main::readStdErr()
    {
        proc.setReadChannel(QProcess::StandardError);
        QByteArray ba = proc.readAll();
        QString s = decoder->toUnicode(ba);
        ba = encoder->fromUnicode(s);
        fwrite(ba.constData(), 1, ba.size(), stderr);
        fflush(stderr);
    }
    
    void Main::readStdOut()
    {
        proc.setReadChannel(QProcess::StandardOutput);
        QByteArray ba = proc.readAll();
        QString s = decoder->toUnicode(ba);
        ba = encoder->fromUnicode(s);
        fwrite(ba.constData(), 1, ba.size(), stdout);
        fflush(stdout);
    }
    
    void Main::onExit(int code)
    {
        QCoreApplication::exit(code);
    }
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
        Main m;
        m.start(argc, argv);
        return a.exec();
    }
    

    main.h:

    #ifndef MAIN_H
    #define MAIN_H
    
    #include <QObject>
    #include <QProcess>
    #include <QTextCodec>
    
    class Main: public QObject {
        Q_OBJECT
    public:
        void start(int argc, char **argv);
    private:
        QProcess proc;
        QTextCodec *decoder, *encoder;
    private slots:
        void readStdErr();
        void readStdOut();
        void onExit(int code);
    };
    
    #endif // MAIN_H
    

    полученный файл переименовываем в cl.exe, в каталоге Visual Studio ищем в VC/bin файл cl.exe, переименовываем его в cl_real.exe, а на его место кладём наш cl.exe.

    Дерзайте.



  • я пользуюсь решением, которое можно найти по ссылке в камментах
    http://codedchaos.blogspot.ru/2012/09/qt-creator-windows.html

    Анонимный6 января 2015 г., 3:02
    Идеально сработал предложенный выше вариант собрать jom.exe из исходников http://qt.gitorious.org/qt-labs/jom/ , добавив две строчки в main.cpp

    int main(int argc, char* argv[])
    {
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    int result = 0;

    Cборку можно произвести в самом Qt Creator, а не ковыряться в командной строке разработчика vs2012. Проверено на Qt Creator 3.3.0 (MSVC 2013, 64 бита).



  • Народ, проблему решил) Тупо снес студию и поставил Qt с mingw =)

    Теперь другая неприятность:

    Написал прогу, она работает, если запускать из среды разработки. Сделал релизную сборку, в папку с исполняемым файлом перетащил все .dll из папки bin Creator. При запуске .exe метерится:

    Точка входа в процедцру _ZN10QArrayData10deallocateEPS_jj не найдена в библиотеке DLL

    Как с этим бороться? Что ему не хватает?

    Кстати, всем спасибо большущее за ответы!!!!



  • для винды вероятно требуется папка platforms, содержащая qwindows.dll и несколько длл из папки не креатора, а самого фреймворка (что-то типа "c:\Qt\Qt5.4.1\5.4\mingw491_32\bin")
    а вообще, добрые люди ролик сделали:
    http://www.youtube.com/watch?v=8qozxqSZQEg



  • Спасибо! Только у меня mingw... Попробую найти в нете, как с ним управляться :)



  • Мне помог видос:
    http://www.youtube.com/watch?v=X1BsPQue5-k

    Через Dependency Walker посмотрел нужные либы и скопировал их в папку с исполняемым файлом.
    Этого оказалось недостаточно. Остатки докидывал по сообщениям ошибок при запуске проги.
    Нашел еще прогу windeployqt, но так и не понял, как ее юзать.



  • @Qt-programmer said:

    Только у меня компилятор mingw

    для mingw отличий не много, главное чтобы операционная система была windows. )



  • jom.exe скомпилированный в кодировке cp1251
    https://yadi.sk/d/95W-59e3s5GLT

    Кидать в папку Tools\QtCreator\bin с заменой старого, мне помогло (компилятор MSVC2015):
    http://image.prntscr.com/image/687648eba52148ed8369b35f5f674932.png



  • Написал подробную статью как исправить jom файл http://blog.harrix.org/article/5888



  • @Harrix Чем писать такие статьи, лучше бы патч для jom на ревью выкатил, чтобы он без пересборки мог работать



  • @Konstantin-Tokarev Зачем городить костыли когда у тебя на руках готовый инструментарий согласен с предыдущим автором, как по мне так проще пересобрать что я только что и сделал. 100% результат.


Log in to reply