【问题标题】:Qt crashes on system call?Qt 在系统调用时崩溃?
【发布时间】:2013-12-31 02:11:00
【问题描述】:

我有以下 cpp 文件:

#include <iostream>                  
#include <stdlib.h>
#include <cstdlib>
using namespace std;

  int main(int,char*[])
  {
    int b = std::system("dot -Tdot ./a.dot -o ./a3.dot");
    cout << "ret: " << b << endl;
    return 0;
  }

从 cmd 运行:

g++ -O2 -Wall -pedantic -pthread q2.cpp -lboost_graph && ./a.out

创建a3.dot 运行良好

qtcreator 运行同一个文件我得到:

Segmentation fault (core dumped)
ret: 35584

这是来自Qt的编译器输出

make: Entering directory `/home/studnet/QtProjects/T2-build-desktop-Qt_4_8_1_in_PATH__System__Release'
g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_WEBKIT -DQT_NO_DEBUG -DQT_DECLARATIVE_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I../T2 -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtDeclarative -I/usr/include/qt4 -I../T2/qmlapplicationviewer -I. -I../T2 -I. -o main.o ../T2/main.cpp
g++ -Wl,-O1 -o T2 main.o qmlapplicationviewer.o moc_qmlapplicationviewer.o    -L/usr/lib/i386-linux-gnu -lQtDeclarative -lQtGui -lQtCore -lpthread 

我尝试在 Qt 中调试它,但我对它相当陌生,并获得了一个程序集窗口。我把a.out放在qt通常读取文件的build文件夹和源文件夹中以防万一。

有什么建议可以解决这个问题吗?

谢谢。

编辑:

我试过了:

QProcess process;
process.start("dot", QStringList() << "-Tdot ./a.dot -o ./a3.dot");
process.waitForFinished(-1);

然后我没有得到文件。

【问题讨论】:

  • Running the same file with Qt I get: -> “用Qt运行”是什么意思?
  • @LaszloPapp 查看更新。
  • 还是不够。你的项目文件是什么?您使用的是命令行、qtcreator 还是 cmake?请提供更多信息。
  • 每次有人说“系统调用”我都会很兴奋。直到我打开问题。
  • @LaszloPapp qtcreator 我认为使用 qmake

标签: c++ qt segmentation-fault system-calls qtcore


【解决方案1】:

当您声称“使用 Qt 运行它”时,您的问题是相当的。我会假设你的意思是 qmake 在这一点上基于缺少 QtCreator 或任何其他 IDE 标记的问题。

并不是说它应该崩溃,但是您在创建它时似乎使用了一个 GUI 项目,即使这似乎是一个基于命令行的应用程序。这就是证明:

-I../T2/qmlapplicationviewer

我鼓励您重新配置它或创建一个新的。基本上,下面带有项目文件的代码对我来说很好。

main.cpp

#include <iostream>                  
#include <cstdlib>

using namespace std;

int main(int,char*[])
{
  int b = std::system("dot -Tdot ./a.dot -o ./a3.dot");
  cout << "ret: " << b << endl;
  return 0;
}

main.pro

TEMPLATE = app
TARGET = main
QT -= core gui
SOURCES += main.cpp

构建并运行

qmake && make

为了回复您的 lat 编辑:

QProcess process;
process.start("dot", QStringList() << "-Tdot ./a.dot -o ./a3.dot");
process.waitForFinished(-1);

这是错误的。您需要重新阅读 start 方法的工作原理:

void QProcess::start(const QString & program, const QStringList & arguments, OpenMode mode = ReadWrite

您需要将参数作为字符串列表传递,而不是将所有参数作为字符串列表中的字符串传递。因此,正确的代码应该是这样的:

QProcess process;
process.start("dot", QStringList()
                      << QString("-Tdot")
                      << QString("./a.dot")
                      << QString("-o")
                      << QString("./a3.dot"));
process.waitForFinished(-1);

请注意,对于两种方法中的任何一种,您可能都需要使用正确的路径,而不是假定位于应用程序所在文件夹中的路径,因为它当前在两个 sn-ps 中都显示。

您可以尝试通过应用程序实例中的getting the application dir 静态或动态地使用绝对路径。或者,您也可以在 QProcess 实例上set the working directory

当涉及到 QtCreator 时,这一点尤其重要,因为 IDE 倾向于将构建目录更改为自定义目录,而不是在源文件旁边生成构建文件,以实现清晰的分离。如果您不这样做,文件可能仍由您调用的进程生成,但不是在您要查找它的源目录中,而是在构建目录中。

【讨论】:

  • @Laszio Papp 感谢您的回答,我复制了您的内容,cmd 仍然崩溃。即使完成了这项工作,我仍然需要它作为 GUI 应用程序的一部分。
  • @mihajlv:请停止谈论 gui 部分。这与 AFAICT 无关。此外,我根本无法重现崩溃,所以我相信您确实没有提供所有必要的细节,或者没有正确复制设置。您的自定义 dot 命令可能有问题。如果没有更多的细节和背景,我们真的无法知道。您甚至没有共享 Qt 和 QtCreator 版本。
  • @Laszio Papp,你有什么工作,但是我必须从文件夹中运行 exe 才能获得a3.dot。我想做的是产生a3.dot,然后在系统调用后读入。我想我必须看看 QProcess 的 gui 部分。
  • @mihajlv:我之前也在我的解决方案中发布了 QProcess ......请看一下。另外,请注意 QProcess 是在 QtCore 中,而不是 QtGui,所以不需要 GUI...
  • @Laszio Papp,我只是在看那个:),我做了:process.execute("dot", QStringList() &lt;&lt; "-Tdot" &lt;&lt; "./a.dot" &lt;&lt; "-o"&lt;&lt; "./a3.dot"); 唯一的问题是当我从 qtcreator 运行程序时它没有创建文件,但是当我从 cmd 启动 exe 它工作正常......关于这里发生了什么的任何想法?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-31
  • 1970-01-01
  • 1970-01-01
  • 2019-10-31
相关资源
最近更新 更多