gpt4 book ai didi

c++ - Qt 在系统调用时崩溃?

转载 作者:行者123 更新时间:2023-11-28 03:00:58 26 4
gpt4 key购买 nike

我有以下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 放在 build 文件夹中,qt 通常从那里读取文件,并放在源文件夹中以防万一。

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

谢谢。

编辑:

我试过这个:

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

但是我没有得到任何文件。

最佳答案

当您声称“使用 Qt 运行它”时,您的问题很明确。基于缺少 QtCreator 或任何其他问题的 IDE 标记,我假设您此时指的是 qmake

并不是说它会崩溃,但您在创建它时似乎使用了 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;
}

主程序

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

构建并运行

qmake && make

为了回复您的经纬度编辑:

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 尝试静态或动态地使用绝对路径从应用程序实例。或者,您也可以 set the working directory在 QProcess 实例上。

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

关于c++ - Qt 在系统调用时崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20850679/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com