Qt вылетает при системном вызове?

0

У меня есть следующий файл 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);

Но тогда у меня нет файла.

  • 0
    Running the same file with Qt I get: -> Что означает «запускать его с Qt»?
  • 0
    @LaszloPapp см. Обновление.
Показать ещё 5 комментариев
Теги:
qt
segmentation-fault
system-calls
qtcore

1 ответ

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

Чтобы ответить на ваше лат-редактирование:

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

Это не верно. Вам нужно будет перечитать, как работает метод запуска:

void QProcess :: start (const QString & program, const QStringList & arguments, режим OpenMode = ReadWrite

Вам нужно передать аргументы как список строк, а не все аргументы в виде строки в списке строк. Таким образом, правильный код будет примерно таким:

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

Обратите внимание, что для любого из двух подходов вам может понадобиться использовать правильный путь, а не тот, который предположительно находится в папке, где приложение является ромом, так как оно представлено в обоих фрагментах.

Вы можете попытаться использовать абсолютные пути как статически, так и динамически, получая файл-приложение из экземпляра приложения. Кроме того, вы также можете установить рабочий каталог экземпляра QProcess.

Это особенно важно, когда речь идет о QtCreator, поскольку среда IDE имеет тенденцию изменять каталог сборки на пользовательский, чтобы не создавать файлы сборки рядом с исходными файлами для обеспечения четкого разделения. Если вы этого не сделаете, файлы могут быть сгенерированы вызываемым процессом, но не в исходном каталоге, где вы его искали, а в каталоге сборки.

  • 0
    @Laszio Papp спасибо за ответ, я продублировал то, что у тебя было, cmd все еще не работает. Даже если это работает, мне все еще нужно это как часть приложения с графическим интерфейсом.
  • 0
    @mihajlv: пожалуйста, прекратите говорить о части графического интерфейса. Это не имеет значения AFAICT. Кроме того, я вообще не могу воспроизвести сбой, поэтому я полагаю, что вы на самом деле либо не предоставили все необходимые детали, либо не реплицировали установку соответствующим образом. У вас могут быть проблемы с вашей пользовательской dot командой. Мы действительно не можем знать без лота больше деталей и контекста. Вы даже не поделились версиями Qt и QtCreator.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню