_popen() returns 没有

_popen() returns nothing

这是一个 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);
}

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

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

要测试它,请尝试修改您的 curFile 以指向一个不存在的文件,您将得到一个典型的 gcc.

输出错误

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

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

当我没有任何错误时,我在 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();
}