Qt在系统调用时崩溃了吗?

时间:2013-12-31 02:11:01

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

我有以下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中调试它,但我对它很新,并得到一个程序集Window。我将a.out放在qt通常读取文件的build文件夹中,以及以防万一。在源文件夹中。

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

谢谢。

编辑:

我试过了:

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

但后来我没有文件。

1 个答案:

答案 0 :(得分:2)

当您声称“使用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);

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

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

这对于QtCreator来说尤为重要,因为IDE倾向于将构建目录更改为自定义目录,而不是在源文件旁边生成构建文件以实现明确分离。如果不这样做,文件可能仍然由您调用的进程生成,但不会在您查找它的源目录中生成,而是生成目录。