Search code examples
c++qtqt5popen

_popen() returns nothing


This is a Qt program. I am trying to run gcc command and get the result using _popen(on Windows). However, I get no output.

After debugging, I find that gcc command runs ok.

void editor::on_action_Compile_triggered()
{
    QString str = "gcc \""+curFile+"\" -o \""+outputFile+"\" 2>&1"; //compile curFile 

    FILE *fp = _popen(str.toStdString().data(),"r");

    if (!fp)
    {
        ui->Log->setText("Error."); //Log is a text browser
    }
    else
    {
        QString tmpStr = "";
        char tmp[1024] = { 0 };

        while (fgets(tmp, 1024, fp) != NULL) //read fp
            tmpStr += (QString)tmp;

        ui->Log->setText(tmpStr); //print to screen
    }
    _pclose(fp);
}

Solution

  • According to me, you are not having a problem. Your above code is working for me (as long as I declare a correct curfile and outputFile). You are not having an ouput because gcc has successfully compiled the file. You may want to verify if the file called outputFile has been produced. Indeed, when gcc succeeds, it does not ouput anything.

    Otherwise, you might be having a problem with your signal/slot connexion which does not trigger the slot on_action_Compile_triggered(then please read on the complete code provided below)

    To test it try to modify your curFile to point to an inexisting file and you will get an ouput error typical of gcc.

    To check this, as for me, I created a QmainWindow with a QPushButton button (called pushbutton) and a QtextEdit (called Log). I provide my complete code below.

    When I have an error (for instance the compiled file is not found. to emulate this, rename your curFile into a wrong file), I obtain this (using your code above).

    enter image description here

    When I do not have any error, I obtain nothing in the QTextEditcontrol but the outputFile executable file is produced by gcc in the directory:

    Here is my code:

    // QMainWindow.h

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    
    namespace Ui {
    class MainWindow;
    }
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
    
    public slots:
        void compile();
    
    private:
        Ui::MainWindow *ui;
    };
    
    #endif // MAINWINDOW_H
    

    // QMainWindow.cpp

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <QDebug>
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        QObject::connect(ui->pushButton, &QPushButton::clicked, this, &MainWindow::compile);
    }
    
    MainWindow::~MainWindow()
    {
        QObject::disconnect(ui->pushButton, &QPushButton::clicked, this, &MainWindow::compile);
    
        delete ui;
    }
    
    void MainWindow::compile()
    {
        QString curFile("..\\..\\T0180694\\test.c");
        QString outputFile("..\\..\\T0180694\\test.exe");
        //copied all from your code
        QString str = "gcc \""+curFile+"\" -o \""+outputFile+"\" 2>&1"; //compile curFile
    
        FILE *fp = _popen(str.toStdString().data(),"r");
    
        if (!fp)
        {
            ui->Log->setText("Error."); //Log is a text browser
        }
        else
        {
            QString tmpStr = "";
            char tmp[1024] = { 0 };
    
            while (fgets(tmp, 1024, fp) != NULL) //read fp
                tmpStr += (QString)tmp;
    
            ui->Log->setText(tmpStr); //print to screen
        }
        _pclose(fp);
        //until here
    }
    
    

    //main.cpp

    #include "mainwindow.h"
    #include <QApplication>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w;
        w.show();
    
        return a.exec();
    }