_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);
}
据我所知,您没有遇到问题。您上面的代码对我有用(只要我声明正确的 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();
}
这是一个 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);
}
据我所知,您没有遇到问题。您上面的代码对我有用(只要我声明正确的 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();
}