Skip to content

Emscripten Fails to Build Qt5 App - Please Help #9624

Description

@DragonOsman

I'm trying to build a Qt5 app to Wasm and I passed this command:

em++ -std=c++17 -Wall -pedantic -I"C:\Qt\5.13.1\wasm_32\include" -I"C:\Qt\5.13.1\wasm_32\include\QtCore" -I"C:\Qt\5.13.1\wasm_32\include\QtPrintSupport" -I"C:\Qt\5.13.1\wasm_32\include\QtWidgets" main.cpp notepad.cpp -LC:\Qt\5.13.1\wasm_32\lib -s WASM=1 -s EXPORT_ALL=1 -o notepad.js 2> build.log

Here's a link to the build.log file.

main.cpp:

#include "notepad.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication EditorApp(argc, argv);
    Notepad Editor;
    Editor.show();

    return EditorApp.exec();
}

notepad.h:

#ifndef NOTEPAD_H
#define NOTEPAD_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui
{
class Notepad;
}
QT_END_NAMESPACE

class Notepad : public QMainWindow
{
    Q_OBJECT

public:
    explicit Notepad(QWidget *parent = nullptr);
    ~Notepad();

private slots:
    void on_actionNew_triggered();

    void on_actionOpen_triggered();

    void on_actionSave_triggered();

    void on_actionSave_As_triggered();

    void on_actionPrint_triggered();

    void on_actionExit_triggered();

    void on_actionCopy_triggered();

    void on_actionCut_triggered();

    void on_actionPaste_triggered();

    void on_actionUndo_triggered();

    void on_actionRedo_triggered();

    void on_actionSelect_Font_triggered();

    void on_actionBold_triggered();

    void on_actionItalic_triggered();

    void on_actionUnderline_triggered();

private:
    Ui::Notepad *ui;
    QString current_file;
};
#endif // NOTEPAD_H

notepad.cpp:

#include "notepad.h"
#include "../build-notepad-project-Desktop_Qt_5_13_1_MSVC2017_64bit-Release/ui_notepad.h"

#include <QFileDialog>
#include <QMessageBox>
#include <QTextStream>
#include <QPrinter>
#include <QPrintDialog>
#include <QFontDialog>
#include <QFile>

Notepad::Notepad(QWidget *parent)
    : QMainWindow{parent}
    , ui{new Ui::Notepad}
{
    ui->setupUi(this);
    this->setCentralWidget(ui->textEdit);

    connect(ui->actionNew, &QAction::triggered, this, &Notepad::on_actionNew_triggered);
    connect(ui->actionOpen, &QAction::triggered, this, &Notepad::on_actionOpen_triggered);
    connect(ui->actionSave, &QAction::triggered, this, &Notepad::on_actionSave_triggered);
    connect(ui->actionSave_As, &QAction::triggered, this, &Notepad::on_actionSave_As_triggered);
    connect(ui->actionPrint, &QAction::triggered, this, &Notepad::on_actionPrint_triggered);
    connect(ui->actionExit, &QAction::triggered, this, &Notepad::on_actionExit_triggered);
    connect(ui->actionCopy, &QAction::triggered, this, &Notepad::on_actionCopy_triggered);
    connect(ui->actionCut, &QAction::triggered, this, &Notepad::on_actionCut_triggered);
    connect(ui->actionPaste, &QAction::triggered, this, &Notepad::on_actionPaste_triggered);
    connect(ui->actionUndo, &QAction::triggered, this, &Notepad::on_actionUndo_triggered);
    connect(ui->actionRedo, &QAction::triggered, this, &Notepad::on_actionRedo_triggered);
    connect(ui->actionSelect_Font, &QAction::triggered, this, &Notepad::on_actionSelect_Font_triggered);
    connect(ui->actionBold, &QAction::triggered, this, &Notepad::on_actionBold_triggered);
    connect(ui->actionItalic, &QAction::triggered, this, &Notepad::on_actionItalic_triggered);
    connect(ui->actionUnderline, &QAction::triggered, this, &Notepad::on_actionUnderline_triggered);

    // Disable menu actions for unavailable features
#if !QT_CONFIG(printer)
    ui->actionPrint->setEnabled(false);
#endif

#if !QT_CONFIG(clipboard)
    ui->actionCut->setEnabled(false);
    ui->actionCopy->setEnabled(false);
    ui->actionPaste->setEnabled(false);
#endif
}

Notepad::~Notepad()
{
    delete ui;
}


void Notepad::on_actionNew_triggered()
{
    current_file.clear();
    ui->textEdit->setText(QString());
}

void Notepad::on_actionOpen_triggered()
{
    QString file_name = QFileDialog::getOpenFileName(this, "Open the file");
    QFile file(file_name);

    current_file = file_name;
    if (!file.open(QIODevice::ReadOnly | QFile::Text))
    {
        QMessageBox::warning(this, "Warning", "Cannot open file: " + file.errorString());
        return;
    }

    setWindowTitle(file_name);
    QTextStream in(&file);
    QString text = in.readAll();
    ui->textEdit->setText(text);
    file.close();
}

void Notepad::on_actionSave_triggered()
{
    QString file_name;

    // If we don't have a filename from before, get one.
    if (current_file.isEmpty())
    {
        file_name = QFileDialog::getSaveFileName(this, "Save");
        current_file = file_name;
    }
    else
    {
        file_name = current_file;
    }

    QFile file(file_name);
    if (!file.open(QIODevice::WriteOnly | QFile::Text)) {
        QMessageBox::warning(this, "Warning", "Cannot save file: " + file.errorString());
        return;
    }

    setWindowTitle(file_name);
    QTextStream out(&file);
    QString text = ui->textEdit->toPlainText();
    out << text;
    file.close();
}

void Notepad::on_actionSave_As_triggered()
{
    QString file_name{QFileDialog::getSaveFileName(this, "Save as")};
    QFile file{file_name};

    if (!file.open(QFile::WriteOnly | QFile::Text))
    {
        QMessageBox::warning(this, "Warning", "Cannot save file: " + file.errorString());
        return;
    }

    current_file = file_name;
    setWindowTitle(file_name);
    QTextStream out{&file};
    QString text{ui->textEdit->toPlainText()};
    out << text;
    file.close();
}

void Notepad::on_actionPrint_triggered()
{
#if QT_CONFIG(printer)
    QPrinter print_device;
#if QT_CONFIG(printdialog)
    QPrintDialog dialog{&print_device, this};
    if (dialog.exec() == QDialog::Rejected)
    {
        return;
    }
#endif // QT_CONFIG(printdialog)
#endif // QT_CONFIG(printer)
}

void Notepad::on_actionExit_triggered()
{
    QCoreApplication::quit();
}

void Notepad::on_actionCopy_triggered()
{
#if QT_CONFIG(clipboard)
    ui->textEdit->copy();
#endif
}

void Notepad::on_actionCut_triggered()
{
#if QT_CONFIG(clipboard)
    ui->textEdit->cut();
#endif
}

void Notepad::on_actionPaste_triggered()
{
#if QT_CONFIG(clipboard)
    ui->textEdit->paste();
#endif
}

void Notepad::on_actionUndo_triggered()
{
    ui->textEdit->undo();
}

void Notepad::on_actionRedo_triggered()
{
    ui->textEdit->redo();
}

void Notepad::on_actionSelect_Font_triggered()
{
    bool font_selected;
    QFont font{QFontDialog::getFont(&font_selected, this)};

    if (font_selected)
    {
        ui->textEdit->setFont(font);
    }
}

void Notepad::on_actionBold_triggered()
{
    ui->textEdit->setFontWeight(QFont::Weight::Bold);
}

void Notepad::on_actionItalic_triggered()
{
    ui->textEdit->setFontItalic(true);
}

void Notepad::on_actionUnderline_triggered()
{
    ui->textEdit->setFontUnderline(true);
}
```ui_notepad.h:
```cpp
/********************************************************************************
** Form generated from reading UI file 'notepad.ui'
**
** Created by: Qt User Interface Compiler version 5.13.1
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/

#ifndef UI_NOTEPAD_H
#define UI_NOTEPAD_H

#include <QtCore/QVariant>
#include <QtWidgets/QAction>
#include <QtWidgets/QApplication>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QMenu>
#include <QtWidgets/QMenuBar>
#include <QtWidgets/QStatusBar>
#include <QtWidgets/QTextEdit>
#include <QtWidgets/QVBoxLayout>
#include <QtWidgets/QWidget>

QT_BEGIN_NAMESPACE

class Ui_Notepad
{
public:
    QAction *actionNew;
    QAction *actionOpen;
    QAction *actionSave;
    QAction *actionSave_As;
    QAction *actionPrint;
    QAction *actionExit;
    QAction *actionCopy;
    QAction *actionCut;
    QAction *actionPaste;
    QAction *actionUndo;
    QAction *actionRedo;
    QAction *actionSelect_Font;
    QAction *actionBold;
    QAction *actionItalic;
    QAction *actionUnderline;
    QWidget *centralwidget;
    QVBoxLayout *verticalLayout;
    QTextEdit *textEdit;
    QMenuBar *menubar;
    QMenu *menuNew;
    QMenu *menuOpen;
    QMenu *menuSave;
    QMenu *menuSave_As;
    QMenu *menuPrint;
    QMenu *menuExit;
    QMenu *menuCopy;
    QMenu *menuCut;
    QMenu *menuPaste;
    QMenu *menuUndo;
    QMenu *menuRedo;
    QMenu *menuSelect_Font;
    QMenu *menuBold;
    QMenu *menuItalic;
    QMenu *menuUnderline;
    QStatusBar *statusbar;

    void setupUi(QMainWindow *Notepad)
    {
        if (Notepad->objectName().isEmpty())
            Notepad->setObjectName(QString::fromUtf8("Notepad"));
        Notepad->resize(800, 400);
        actionNew = new QAction(Notepad);
        actionNew->setObjectName(QString::fromUtf8("actionNew"));
        actionOpen = new QAction(Notepad);
        actionOpen->setObjectName(QString::fromUtf8("actionOpen"));
        actionSave = new QAction(Notepad);
        actionSave->setObjectName(QString::fromUtf8("actionSave"));
        actionSave_As = new QAction(Notepad);
        actionSave_As->setObjectName(QString::fromUtf8("actionSave_As"));
        actionPrint = new QAction(Notepad);
        actionPrint->setObjectName(QString::fromUtf8("actionPrint"));
        actionExit = new QAction(Notepad);
        actionExit->setObjectName(QString::fromUtf8("actionExit"));
        actionCopy = new QAction(Notepad);
        actionCopy->setObjectName(QString::fromUtf8("actionCopy"));
        actionCut = new QAction(Notepad);
        actionCut->setObjectName(QString::fromUtf8("actionCut"));
        actionPaste = new QAction(Notepad);
        actionPaste->setObjectName(QString::fromUtf8("actionPaste"));
        actionUndo = new QAction(Notepad);
        actionUndo->setObjectName(QString::fromUtf8("actionUndo"));
        actionRedo = new QAction(Notepad);
        actionRedo->setObjectName(QString::fromUtf8("actionRedo"));
        actionSelect_Font = new QAction(Notepad);
        actionSelect_Font->setObjectName(QString::fromUtf8("actionSelect_Font"));
        actionBold = new QAction(Notepad);
        actionBold->setObjectName(QString::fromUtf8("actionBold"));
        actionItalic = new QAction(Notepad);
        actionItalic->setObjectName(QString::fromUtf8("actionItalic"));
        actionUnderline = new QAction(Notepad);
        actionUnderline->setObjectName(QString::fromUtf8("actionUnderline"));
        centralwidget = new QWidget(Notepad);
        centralwidget->setObjectName(QString::fromUtf8("centralwidget"));
        verticalLayout = new QVBoxLayout(centralwidget);
        verticalLayout->setObjectName(QString::fromUtf8("verticalLayout"));
        textEdit = new QTextEdit(centralwidget);
        textEdit->setObjectName(QString::fromUtf8("textEdit"));

        verticalLayout->addWidget(textEdit);

        Notepad->setCentralWidget(centralwidget);
        menubar = new QMenuBar(Notepad);
        menubar->setObjectName(QString::fromUtf8("menubar"));
        menubar->setGeometry(QRect(0, 0, 800, 21));
        menuNew = new QMenu(menubar);
        menuNew->setObjectName(QString::fromUtf8("menuNew"));
        menuOpen = new QMenu(menubar);
        menuOpen->setObjectName(QString::fromUtf8("menuOpen"));
        menuSave = new QMenu(menubar);
        menuSave->setObjectName(QString::fromUtf8("menuSave"));
        menuSave_As = new QMenu(menubar);
        menuSave_As->setObjectName(QString::fromUtf8("menuSave_As"));
        menuPrint = new QMenu(menubar);
        menuPrint->setObjectName(QString::fromUtf8("menuPrint"));
        menuExit = new QMenu(menubar);
        menuExit->setObjectName(QString::fromUtf8("menuExit"));
        menuCopy = new QMenu(menubar);
        menuCopy->setObjectName(QString::fromUtf8("menuCopy"));
        menuCut = new QMenu(menubar);
        menuCut->setObjectName(QString::fromUtf8("menuCut"));
        menuPaste = new QMenu(menubar);
        menuPaste->setObjectName(QString::fromUtf8("menuPaste"));
        menuUndo = new QMenu(menubar);
        menuUndo->setObjectName(QString::fromUtf8("menuUndo"));
        menuRedo = new QMenu(menubar);
        menuRedo->setObjectName(QString::fromUtf8("menuRedo"));
        menuSelect_Font = new QMenu(menubar);
        menuSelect_Font->setObjectName(QString::fromUtf8("menuSelect_Font"));
        menuBold = new QMenu(menubar);
        menuBold->setObjectName(QString::fromUtf8("menuBold"));
        menuItalic = new QMenu(menubar);
        menuItalic->setObjectName(QString::fromUtf8("menuItalic"));
        menuUnderline = new QMenu(menubar);
        menuUnderline->setObjectName(QString::fromUtf8("menuUnderline"));
        Notepad->setMenuBar(menubar);
        statusbar = new QStatusBar(Notepad);
        statusbar->setObjectName(QString::fromUtf8("statusbar"));
        Notepad->setStatusBar(statusbar);

        menubar->addAction(menuNew->menuAction());
        menubar->addAction(menuOpen->menuAction());
        menubar->addAction(menuSave->menuAction());
        menubar->addAction(menuSave_As->menuAction());
        menubar->addAction(menuPrint->menuAction());
        menubar->addAction(menuExit->menuAction());
        menubar->addAction(menuCopy->menuAction());
        menubar->addAction(menuCut->menuAction());
        menubar->addAction(menuPaste->menuAction());
        menubar->addAction(menuUndo->menuAction());
        menubar->addAction(menuRedo->menuAction());
        menubar->addAction(menuSelect_Font->menuAction());
        menubar->addAction(menuBold->menuAction());
        menubar->addAction(menuItalic->menuAction());
        menubar->addAction(menuUnderline->menuAction());
        menuNew->addAction(actionNew);
        menuOpen->addAction(actionOpen);
        menuSave->addAction(actionSave);
        menuSave_As->addAction(actionSave_As);
        menuPrint->addAction(actionPrint);
        menuExit->addAction(actionExit);
        menuCopy->addAction(actionCopy);
        menuCut->addAction(actionCut);
        menuPaste->addAction(actionPaste);
        menuUndo->addAction(actionUndo);
        menuRedo->addAction(actionRedo);
        menuSelect_Font->addAction(actionSelect_Font);
        menuBold->addAction(actionBold);
        menuItalic->addAction(actionItalic);
        menuUnderline->addAction(actionUnderline);

        retranslateUi(Notepad);

        QMetaObject::connectSlotsByName(Notepad);
    } // setupUi

    void retranslateUi(QMainWindow *Notepad)
    {
        Notepad->setWindowTitle(QCoreApplication::translate("Notepad", "Notepad", nullptr));
        actionNew->setText(QCoreApplication::translate("Notepad", "New", nullptr));
        actionOpen->setText(QCoreApplication::translate("Notepad", "Open", nullptr));
        actionSave->setText(QCoreApplication::translate("Notepad", "Save", nullptr));
        actionSave_As->setText(QCoreApplication::translate("Notepad", "Save As", nullptr));
        actionPrint->setText(QCoreApplication::translate("Notepad", "Print", nullptr));
        actionExit->setText(QCoreApplication::translate("Notepad", "Exit", nullptr));
        actionCopy->setText(QCoreApplication::translate("Notepad", "Copy", nullptr));
        actionCut->setText(QCoreApplication::translate("Notepad", "Cut", nullptr));
        actionPaste->setText(QCoreApplication::translate("Notepad", "Paste", nullptr));
        actionUndo->setText(QCoreApplication::translate("Notepad", "Undo", nullptr));
        actionRedo->setText(QCoreApplication::translate("Notepad", "Redo", nullptr));
        actionSelect_Font->setText(QCoreApplication::translate("Notepad", "Select Font", nullptr));
        actionBold->setText(QCoreApplication::translate("Notepad", "Bold", nullptr));
        actionItalic->setText(QCoreApplication::translate("Notepad", "Italic", nullptr));
        actionUnderline->setText(QCoreApplication::translate("Notepad", "Underline", nullptr));
        menuNew->setTitle(QCoreApplication::translate("Notepad", "New", nullptr));
        menuOpen->setTitle(QCoreApplication::translate("Notepad", "Open", nullptr));
        menuSave->setTitle(QCoreApplication::translate("Notepad", "Save", nullptr));
        menuSave_As->setTitle(QCoreApplication::translate("Notepad", "Save As", nullptr));
        menuPrint->setTitle(QCoreApplication::translate("Notepad", "Print", nullptr));
        menuExit->setTitle(QCoreApplication::translate("Notepad", "Exit", nullptr));
        menuCopy->setTitle(QCoreApplication::translate("Notepad", "Copy", nullptr));
        menuCut->setTitle(QCoreApplication::translate("Notepad", "Cut", nullptr));
        menuPaste->setTitle(QCoreApplication::translate("Notepad", "Paste", nullptr));
        menuUndo->setTitle(QCoreApplication::translate("Notepad", "Undo", nullptr));
        menuRedo->setTitle(QCoreApplication::translate("Notepad", "Redo", nullptr));
        menuSelect_Font->setTitle(QCoreApplication::translate("Notepad", "Select Font", nullptr));
        menuBold->setTitle(QCoreApplication::translate("Notepad", "Bold", nullptr));
        menuItalic->setTitle(QCoreApplication::translate("Notepad", "Italic", nullptr));
        menuUnderline->setTitle(QCoreApplication::translate("Notepad", "Underline", nullptr));
    } // retranslateUi

};

namespace Ui {
    class Notepad: public Ui_Notepad {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_NOTEPAD_H

Please help. Thanks in advance.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions