У меня есть следующий файл 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
тот же файл с 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". Я предполагаю, что вы имеете в виду 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
Чтобы ответить на ваше лат-редактирование:
QProcess process;
process.start("dot", QStringList() << "-Tdot ./a.dot -o ./a3.dot");
process.waitForFinished(-1);
Это не верно. Вам нужно будет перечитать, как работает метод запуска:
Вам нужно передать аргументы как список строк, а не все аргументы в виде строки в списке строк. Таким образом, правильный код будет примерно таким:
QProcess process;
process.start("dot", QStringList()
<< QString("-Tdot")
<< QString("./a.dot")
<< QString("-o")
<< QString("./a3.dot"));
process.waitForFinished(-1);
Обратите внимание, что для любого из двух подходов вам может понадобиться использовать правильный путь, а не тот, который предположительно находится в папке, где приложение является ромом, так как оно представлено в обоих фрагментах.
Вы можете попытаться использовать абсолютные пути как статически, так и динамически, получая файл-приложение из экземпляра приложения. Кроме того, вы также можете установить рабочий каталог экземпляра QProcess.
Это особенно важно, когда речь идет о QtCreator, поскольку среда IDE имеет тенденцию изменять каталог сборки на пользовательский, чтобы не создавать файлы сборки рядом с исходными файлами для обеспечения четкого разделения. Если вы этого не сделаете, файлы могут быть сгенерированы вызываемым процессом, но не в исходном каталоге, где вы его искали, а в каталоге сборки.
dot
командой. Мы действительно не можем знать без лота больше деталей и контекста. Вы даже не поделились версиями Qt и QtCreator.
Running the same file with Qt I get:
-> Что означает «запускать его с Qt»?