我有以下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);
但后来我没有文件。
答案 0 :(得分:2)
当您声称“使用Qt运行它”时,您的问题就很明显了。我会假设你的意思是qmake
,因为缺少QtCreator或任何其他IDE标签。
不是它应该崩溃,但你似乎在创建它时使用了一个GUI项目,即使这似乎是一个基于命令行的应用程序。这证明了这一点:
-I../T2/qmlapplicationviewer
我会鼓励你重新配置或者创建一个新的。基本上,下面的项目文件的代码对我来说很好。
#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
要回复你的lat编辑:
QProcess process;
process.start("dot", QStringList() << "-Tdot ./a.dot -o ./a3.dot");
process.waitForFinished(-1);
这是错误的。您需要重新阅读start方法的工作原理:
您需要将参数作为字符串列表传递,而将所有参数作为字符串列表中的字符串传递。因此,正确的代码将是这样的:
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倾向于将构建目录更改为自定义目录,而不是在源文件旁边生成构建文件以实现明确分离。如果不这样做,文件可能仍然由您调用的进程生成,但不会在您查找它的源目录中生成,而是生成目录。