LINUX.ORG.RU

QProcess и gcc -v

 , ,


0

1

Здравствуйте! Сабж - как мне получить вывод gcc -v через QProcess.То что ниже - не работает. Также пробовал вызывать /bin/sh, а потом передавать аргументы - тоже не работает.

QProcess proc;
proc.start("gcc -v");
proc.waitForFinished();
qDebug() << proc.readAll();

Само собой, в консоли всё работает.

Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.9/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.9.3-8ubuntu2~14.04' --with-bugurl=file:///usr/share/doc/gcc-4.9/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.9 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.9 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.9-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.9-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.9-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.9.3 (Ubuntu 4.9.3-8ubuntu2~14.04)

Проблема не только с gcc, но и clang, который в консоли тоже работает.

тогда может кто знает, как сделать так, чтобы я через QProcess смогу clang -v посмотреть? А то всё равно не работает.

zamazan4ik ★★ ()
Ответ на: комментарий от WizardOfOz
Ubuntu clang version 3.6.0-2ubuntu1~trusty1 (tags/RELEASE_360/final) (based on LLVM 3.6.0)
Target: x86_64-pc-linux-gnu
Thread model: posix
Found candidate GCC installation: /usr/bin/../lib/gcc/i686-linux-gnu/4.8
Found candidate GCC installation: /usr/bin/../lib/gcc/i686-linux-gnu/4.8.5
Found candidate GCC installation: /usr/bin/../lib/gcc/i686-linux-gnu/4.9
Found candidate GCC installation: /usr/bin/../lib/gcc/i686-linux-gnu/4.9.3
Found candidate GCC installation: /usr/bin/../lib/gcc/i686-linux-gnu/5.3.0
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8.5
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/4.9
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/4.9.3
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/5.3.0
Found candidate GCC installation: /usr/lib/gcc/i686-linux-gnu/4.8
Found candidate GCC installation: /usr/lib/gcc/i686-linux-gnu/4.8.5
Found candidate GCC installation: /usr/lib/gcc/i686-linux-gnu/4.9
Found candidate GCC installation: /usr/lib/gcc/i686-linux-gnu/4.9.3
Found candidate GCC installation: /usr/lib/gcc/i686-linux-gnu/5.3.0
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.8
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.8.5
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.9
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.9.3
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/5.3.0
Selected GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/4.9
Candidate multilib: .;@m64
Selected multilib: .;@m64
zamazan4ik ★★ ()
Ответ на: комментарий от WizardOfOz

Пробовал : proc.start(«clang -v»), proc.start(«/bin/sh», QStringList() << "-c" << «clang -v»). Читать пробовал такими способами : readAll(), readAllStandardOutput(), readAllStandardError().

про способ с /bin/sh - он не видит clang, хотя моя консоль его прекрасно видит. С чем это связано и как починить это?

zamazan4ik ★★ ()
Ответ на: комментарий от zamazan4ik

Может быть Qt что-то не то делает с PATH?

Для диагностики попробуйте

proc.start(«/bin/sh», QStringList() << "-c" << «echo $PATH»)

proc.start(«/bin/sh», QStringList() << "-c" << «whereis clang»)

GPFault ★★ ()
Последнее исправление: GPFault (всего исправлений: 1)
Ответ на: комментарий от GPFault

proc.start(«/bin/sh», QStringList() << "-c" << «echo $PATH»)

/opt/Qt/5.5/gcc_64/bin:/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games\n

proc.start(«/bin/sh», QStringList() << "-c" << «whereis clang»);

clang: /usr/lib/clang /usr/include/clang /usr/share/clang /opt/cheerp/bin/clang\

zamazan4ik ★★ ()
Ответ на: комментарий от zamazan4ik

Очень инетресный результат. whereis находит бинарник clang в /opt/cheerp/bin/ А при этом в PATH этого пути нет.

Ума не приложу как whereis его при этом находит...

По идее поможет добавление /opt/cheerp/bin/ в PATH в том месте откуда запускается Qt-приложение.

А откуда планируется использовать clang? Действительно из /opt/cheerp/bin/ или должен быть стандартный-системный в /usr/bin?

GPFault ★★ ()
Ответ на: комментарий от GPFault

вообще планируется из /usr/bin . /opt/cheerp/bin - это папка транслятора с крестов на JavaScript

zamazan4ik ★★ ()
Ответ на: комментарий от invy

Ник знакомый... я тебя видел где-то %)

UVV ★★★★★ ()
Ответ на: комментарий от zamazan4ik

Как именно работает whereis я честно говоря не знаю. Но то что он не находит clang в /usr/bin - это очень странно.

покажите как что етсь на эту тему в /usr/bin

ls -l /usr/bin/clang*

На дебиане результат вот такой:


lrwxrwxrwx 1 root root 25 мар 31  2015 /usr/bin/clang -> ../lib/llvm-3.6/bin/clang
lrwxrwxrwx 1 root root 27 мар 31  2015 /usr/bin/clang++ -> ../lib/llvm-3.6/bin/clang++
lrwxrwxrwx 1 root root 25 авг 18  2015 /usr/bin/clang-3.6 -> ../lib/llvm-3.6/bin/clang
lrwxrwxrwx 1 root root 27 авг 18  2015 /usr/bin/clang++-3.6 -> ../lib/llvm-3.6/bin/clang++
lrwxrwxrwx 1 root root 44 мар 31  2015 /usr/bin/clang-apply-replacements -> ../lib/llvm-3.6/bin/clang-apply-replacements
lrwxrwxrwx 1 root root 44 авг 18  2015 /usr/bin/clang-apply-replacements-3.6 -> ../lib/llvm-3.6/bin/clang-apply-replacements
lrwxrwxrwx 1 root root 31 мар 31  2015 /usr/bin/clang-check -> ../lib/llvm-3.6/bin/clang-check
lrwxrwxrwx 1 root root 31 авг 18  2015 /usr/bin/clang-check-3.6 -> ../lib/llvm-3.6/bin/clang-check
lrwxrwxrwx 1 root root 31 мар 31  2015 /usr/bin/clang-query -> ../lib/llvm-3.6/bin/clang-query
lrwxrwxrwx 1 root root 31 авг 18  2015 /usr/bin/clang-query-3.6 -> ../lib/llvm-3.6/bin/clang-query
lrwxrwxrwx 1 root root 32 авг 18  2015 /usr/bin/clang-rename-3.6 -> ../lib/llvm-3.6/bin/clang-rename
lrwxrwxrwx 1 root root 32 мар 31  2015 /usr/bin/clang-tblgen -> ../lib/llvm-3.6/bin/clang-tblgen
lrwxrwxrwx 1 root root 32 авг 18  2015 /usr/bin/clang-tblgen-3.6 -> ../lib/llvm-3.6/bin/clang-tblgen
lrwxrwxrwx 1 root root 30 мар 31  2015 /usr/bin/clang-tidy -> ../lib/llvm-3.6/bin/clang-tidy
lrwxrwxrwx 1 root root 30 авг 18  2015 /usr/bin/clang-tidy-3.6 -> ../lib/llvm-3.6/bin/clang-tidy

GPFault ★★ ()
Ответ на: комментарий от GPFault
lrwxrwxrwx 1 root root 25 апр.  28  2015 /usr/bin/clang-3.6 -> ../lib/llvm-3.6/bin/clang
lrwxrwxrwx 1 root root 27 апр.  28  2015 /usr/bin/clang++-3.6 -> ../lib/llvm-3.6/bin/clang++
lrwxrwxrwx 1 root root 44 апр.  28  2015 /usr/bin/clang-apply-replacements-3.6 -> ../lib/llvm-3.6/bin/clang-apply-replacements
lrwxrwxrwx 1 root root 31 апр.  28  2015 /usr/bin/clang-check-3.6 -> ../lib/llvm-3.6/bin/clang-check
lrwxrwxrwx 1 root root 31 апр.  28  2015 /usr/bin/clang-query-3.6 -> ../lib/llvm-3.6/bin/clang-query
lrwxrwxrwx 1 root root 32 апр.  28  2015 /usr/bin/clang-rename-3.6 -> ../lib/llvm-3.6/bin/clang-rename
lrwxrwxrwx 1 root root 32 апр.  28  2015 /usr/bin/clang-tblgen-3.6 -> ../lib/llvm-3.6/bin/clang-tblgen
lrwxrwxrwx 1 root root 30 апр.  28  2015 /usr/bin/clang-tidy-3.6 -> ../lib/llvm-3.6/bin/clang-tidy

Linux Mint 17.3

Странно, что именно самого clang то и нет... Есть только clang-3.6. Но разве sh не найдёт его по имени clang?

zamazan4ik ★★ ()
Последнее исправление: zamazan4ik (всего исправлений: 1)
Ответ на: комментарий от zamazan4ik

По общепринятому соглашению в stdout выводится только то что является основным результатом работы программы, если он текстовый.

Так например поступает компилятор в режиме препроцессора clang -E.

Если stdout перенаправлен - то может выводиться и бинарный результат.

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

GPFault ★★ ()
Ответ на: комментарий от zamazan4ik

Не найдёт, он просматривает встроенные команды, определённые в shell функции и пути в path. Никакого додумывания.

Вам скорее всего надо установить не только пакет clang-3.6 с конкретной версией но и общий пакет clang.


/tmp$ dpkg -S /usr/bin/clang
clang: /usr/bin/clang
/tmp$ dpkg -S /usr/bin/clang-3.6
clang-3.6: /usr/bin/clang-3.6
GPFault ★★ ()
Ответ на: комментарий от GPFault

Если у программы явным образом запрашивают версию, то вывод версии будет основным результатом работы программы или метаинформацией?

Это должен быть основной результат. (Например, так делают ls, bash, less и многие другие)

Deleted ()
Ответ на: комментарий от Deleted

Попробовал - clang делает также.

Только запрос версии у него это --version, а не -v

-v - это включение verbose-режима (что по сути выдача метаинформации) и оно вполне сочетается с другими ключами, например -E.

И видимо в качестве исключения (или в качестве мелкого бага) если указан только ключ -v то после выдачи начальной метаинформации он не пишет

clang: error: no input files
а просто выходит.

GPFault ★★ ()
Ответ на: комментарий от GPFault

короче, в репах лежит пакет clang-3.6, который у меня и был установлен. Но вот пакет clang есть только в clang-3.4. И по запросу clang запускается clang-3.4.

Мне что, линк делать /usr/bin/clang -> /usr/bin/clang-3.6? Ранее у меня алиас стоял в консоли.

Наверное стоит пояснить, почему меня алиас не устраивает. Утилита на Qt, делает запросы в систему и получает версии разных утилит : компиляторов, валгриндов всяких и так далее.

Так вот, ввиду того, что пакет clang есть далеко не для всех версий пакета clang, то что делать? Самому писать вручную парсер по типичным папкам? Мейнтейнерам стучать, чтобы добавили пакет clang к clang-3.6?

И ещё вопрос : можно ли как-то перенаправить пакет clang, чтобы вызывал clang-3.6 вместо clang-3.4?

zamazan4ik ★★ ()
Последнее исправление: zamazan4ik (всего исправлений: 1)
Ответ на: комментарий от zamazan4ik

Сам пакет clang и делает этот link. Если сделать линк вручную - будет 2 проблемы: во-первых в будущем пакетный менеджер сможет испытывать затруднения при установке пакета clang другой версии, а во-вторых видя наличие clang - утилиты будут ожидать что есть и clang++ и возможно куча каких-то ещё ссылок полный список которых знают только разработчики да мантейнер пакета.

Пакеты clang-3.? могут быть установлены одновременно. А вот пакет clang может быть установлен только один и это определяет на какую версию он ссылается.

Если подключено несколько репозиториев - может быть выбор:

/tmp$ apt list -a clang
Вывод списка… Готово
clang/experimental 1:3.7-34~exp1 i386
clang/testing,unstable 1:3.6-33 i386 [может быть обновлён до: 1:3.6-27~exp2]
clang/now 1:3.6-27~exp2 i386 [установлен, может быть обновлён до: 1:3.6-33]
clang/stable 1:3.5-25 i386

Если нужной версии в списке нет - я обычно ищу вначале здесь https://packages.debian.org/clang

потом на packages.ubuntu.com (во всех выпусках), а потом гуглом или через ubuntuupdates.org ищу типа clang ppa.

Пакеты близкой версии от другого дистрибутива в 70% случаев просто работают, ещё в 25 просто не ставятся или ставятся с ошибкой (в обоих случаях достаточно просто удалить), и совсем редко ставятся но не работают, так что риск невелик.

GPFault ★★ ()
Ответ на: комментарий от zamazan4ik

Например, чтобы разделять то что выводится. Как бы назначения stdout и stderr говорят за себя. Релевантный вывод, который можно скормить другой программе - в stdout, информацию об ошибках, чтобы другая программа не получила чего-то не того, в stderr.

invy ★★★★★ ()
Ответ на: комментарий от GPFault

Только запрос версии у него это --version, а не -v

Блин, точно. И у gcc так же, и по --version пишет в stdout. А -v это:

`-v'
     Print (on standard error output) the commands executed to run the
     stages of compilation.  Also print the version number of the
     compiler driver program and of the preprocessor and the compiler
     proper.

Вывод: надо читать маны прежде чем писать на форум. И мне, и топикстартеру. :DD

Deleted ()
Ответ на: комментарий от Deleted

Да я просто даже не предполагал, что версия может выводиться в stderr

zamazan4ik ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.