_popen() 不返回任何内容

时间:2021-04-02 12:47:47

标签: c++ qt qt5 popen

这是一个 Qt 程序。我正在尝试运行 gcc 命令并使用 _popen(在 Windows 上)获取结果。但是,我没有得到任何输出。

调试后,我发现 gcc 命令运行正常。

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);
}

1 个答案:

答案 0 :(得分:1)

据我所知,您没有问题。您上面的代码对我有用(只要我声明了正确的 curfileoutputFile)。 您没有输出,因为 gcc 已成功编译该文件。您可能需要验证名为 outputFile 的文件是否已生成。实际上,当 gcc 成功时,它不会输出任何内容。

否则,您的 signal/slot 连接可能有问题,不会触发插槽 on_action_Compile_triggered(然后请阅读下面提供的完整代码)

要测试它,请尝试修改您的 curFile 以指向一个不存在的文件,您将收到典型的 gcc 输出错误。

为了检查这一点,就我而言,我创建了一个带有 QmainWindow 按钮(称为按钮)和一个 QPushButton(称为 QtextEdit)的 Log。我在下面提供了我的完整代码。

当我遇到错误时(例如未找到编译的文件。要模拟这一点,请将您的 curFile 重命名为错误的文件),我会得到它(使用您上面的代码)。

enter image description here

当我没有任何错误时,我在 QTextEdit 控件中什么也没有得到,但是 outputFile 可执行文件是由 gcc 在目录中生成的:

这是我的代码:

// 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();
}