这是一个 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);
}
答案 0 :(得分:1)
据我所知,您没有问题。您上面的代码对我有用(只要我声明了正确的 curfile
和 outputFile
)。 您没有输出,因为 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();
}