Странная ошибка при попытке развернуть приложение qt5 на raspberry pi

У меня есть проект, который я сделал на Ubuntu 14.04 LTS, но затем я хотел проверить, сможет ли Raspberry Pi запустить эту мою маленькую программу. Затем я следовал инструкциям по этой ссылке, чтобы скомпилировать и собрать qt5 изначально на Pi.

Мне удалось установить qt5 без проблем, я даже смог скомпилировать и запустить программу «куб», которая находится на образцах qt.

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

Хорошо, все выглядело хорошо. Затем я клонировал свой проект на Pi, запустил qmake, а после этого запустил make. Пока... я не получил это сообщение об ошибке:

In file included from ../mainWindow.h:14:0,
             from ../main.cpp:3:
../core/core.h: In constructor ‘bumbatv::core::Core::Core()’:
../core/core.h:37:36: error: conversion from ‘int’ to ‘QString’ is ambiguous
../core/core.h:37:36: note: candidates are:
/usr/local/qt5/include/QtCore/qstring.h:649:31: note: QString::QString(const char*)
/usr/local/qt5/include/QtCore/qstring.h:214:14: note: QString::QString(const QChar*, int)
Makefile:2564: recipe for target 'main.o' failed
make: *** [main.o] Error 1

Дело в том... В этой конкретной области кода у меня нет преобразования из int в QString!

class Core : public QObject
{
Q_OBJECT
private:
    static Core *instance_;
    QHash <int, Channel*> channels_;
    int currentChannelId_;
    QString computerName_;
    QString projectDirectory_; 
    Definitions::kPlayerStatus player_;
    QHash<int, Media*> medias_;
    QString userEmail_;
    QString userPassword_;
    QString userPasswordEncrypted_;
    bool logged_;

    Core(){
        Channel *channel = new Channel; // This is the error line.
        channels_.insert(channel->getId(),channel);
        currentChannelId_ = channel->getId();
        player_ = Definitions::kStopped;
        logged_ = false;
    }

    Core(const Core&);
    Core& operator=(const Core&);
    /* Protect destructor.
     * Deletes all elements allocated in the Document.
     */
    ~Core()
    {
        // Delete channels
        foreach (Channel *c, channels_)
            delete c;
    }
(...)
}

А вот и конструктор канала:

        class Channel : public QObject
{
Q_OBJECT
private:

    static int countChannel_; 
    int idChannel_; 
    QString label_; 
    int currentMediaId_; 
    int totalTime_; 
    int order_; 

    QHash<int, Media*> medias_;  


signals:
    (...)

public:
    Channel(int id = -1, int order = -1, int totalTime = -1, QString label = NULL) {
        if(id==-1){
            idChannel_ = countChannel_++;
        }else{
            idChannel_ = id;
            countChannel_ = countChannel_ <= id ? id+1 : countChannel_;
        }

        order_ = order == -1 ? idChannel_ : order;
        totalTime_ = totalTime == -1 ? 0 : totalTime;
        label_ = label == NULL ? QString("Channel %1").arg(idChannel_+1) : label;
    }

    /* Protect destructor.
     * Deletes all elements allocated in the Channel.
     */
    ~Channel()
    {
        // Delete medias
        foreach (Media *m, medias_)
            delete m;
    }
(...)

}

А вот команда, вызываемая make:

/usr/bin/g++ -c -pipe -marm -mfpu=vfp -mtune=arm1176jzf-s -march=armv6zk -mabi=aapcs-linux -mfloat-abi=hard -O2 -std=c++0x -Wall -W -D_REENTRANT -fPIE -DQT_NO_SSL -DQT_NO_DEBUG -DQT_MULTIMEDIAWIDGETS_LIB -DQT_MULTIMEDIA_LIB -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_XML_LIB -DQT_CORE_LIB -I../../vodas_desktop -I. -I/usr/local/qt5/include -I/usr/local/qt5/include/QtMultimediaWidgets -I/usr/local/qt5/include/QtMultimedia -I/usr/local/qt5/include/QtWidgets -I/usr/local/qt5/include/QtGui -I/usr/local/qt5/include/QtNetwork -I/usr/local/qt5/include/QtXml -I/usr/local/qt5/include/QtCore -I. -I/opt/vc/include -I/opt/vc/include/interface/vcos/pthreads -I/opt/vc/include/interface/vmcs_host/linux -I/usr/local/qt5/mkspecs/devices/linux-rasp-pi-g++ -o main.o ../main.cpp

Итак... Есть мысли? Я понятия не имею, что не так. Мой код компилируется в Ubuntu и Windows без этого сообщения об ошибке.


person Mauker    schedule 29.04.2015    source источник
comment
Нам нужно увидеть весь ваш основной класс и конструктор   -  person dwcanillas    schedule 29.04.2015
comment
Вот оно. Плюс конструктор каналов. @dwcanillas   -  person Mauker    schedule 29.04.2015


Ответы (1)


Ваш аргумент по умолчанию для QString недействителен:

QString label = NULL

NULL — это просто макрос для 0, поэтому вы фактически говорите QString label = 0. QString не определяет способ создания QString из int, что является причиной вашей ошибки - я предполагаю, что на большинстве платформ конструктор QString(const char *) будет вызываться с неявным преобразованием из 0 в const char *.

Похоже, у вашего pi возникли проблемы с выяснением того, как неявно преобразовать этот 0. Измените его на QString label = "", QString label = QString() или что-то подобное.

person dwcanillas    schedule 29.04.2015
comment
Я постараюсь это сделать. Вернусь через некоторое время. - person Mauker; 29.04.2015
comment
Кажется, это работает! Но малина немного медленно компилируется, поэтому я дам вам знать, если все прошло нормально. Спасибо! - person Mauker; 29.04.2015