如何解决_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);
}
解决方法
据我所知,您没有问题。您上面的代码对我有用(只要我声明了正确的 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,&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();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。