Как заставить make/gcc показать мне команды?
Я пытаюсь отладить проблему компиляции, но я не могу заставить GCC (или, может быть, это make??) показать мне фактические команды компилятора и компоновщика, которые он выполняет. Вот результат, который я вижу:
CCLD libvirt_parthelper
libvirt_parthelper-parthelper.o: In function `main':
/root/qemu-build/libvirt-0.9.0/src/storage/parthelper.c:102: undefined reference to `ped_device_get'
/root/qemu-build/libvirt-0.9.0/src/storage/parthelper.c:116: undefined reference to `ped_disk_new'
/root/qemu-build/libvirt-0.9.0/src/storage/parthelper.c:122: undefined reference to `ped_disk_next_partition'
/root/qemu-build/libvirt-0.9.0/src/storage/parthelper.c:172: undefined reference to `ped_disk_next_partition'
/root/qemu-build/libvirt-0.9.0/src/storage/parthelper.c:172: undefined reference to `ped_disk_next_partition'
collect2: ld returned 1 exit status
make[3]: *** [libvirt_parthelper] Error 1
То, что я хочу увидеть, должно быть примерно таким:
$ make
gcc -Wall -c -o main.o main.c
gcc -Wall -c -o hello_fn.o hello_fn.c
gcc main.o hello_fn.o -o main
Обратите внимание, как в этом примере отображается полная команда gcc. Приведенный выше пример просто показывает такие вещи, как "CCLD libvirt_parthelper". Я не уверен, как контролировать это поведение.
8 ответов
Чтобы вызвать пробный прогон:
make -n
Это покажет, что make
пытается сделать.
Построить системно-независимый метод
make SHELL='sh -x'
это еще один вариант. Образец Makefile
:
a:
@echo a
Выход:
+ echo a
a
Это устанавливает особый SHELL
переменная для make
, а также -x
говорит sh
распечатать расширенную строку перед ее выполнением.
Одно преимущество перед -n
это то, что на самом деле выполняет команды. Я обнаружил, что для некоторых проектов (например, ядра Linux) это -n
может перестать работать намного раньше, чем обычно, возможно, из-за проблем с зависимостями.
Недостатком этого метода является то, что вы должны убедиться, что оболочка, которая будет использоваться sh
, который по умолчанию используется Make, поскольку они являются POSIX, но могут быть изменены с помощью SHELL
сделать переменную.
дела sh -v
было бы круто, но Dash 0.5.7 (Ubuntu 14.04 sh
) игнорирует -c
команды (что, кажется, как make
использует его), поэтому он ничего не делает.
make -p
Вас также заинтересует, что выводит значения заданных переменных.
Сгенерированные CMake Makefiles
make VERBOSE=1
Смотрите: Использование CMake с GNU Make: Как я могу увидеть точные команды?
Библиотечные make-файлы, сгенерированные autotools ./configure
Вы должны выпустить) часто есть подробный вариант, поэтому в основном, используя make VERBOSE=1
или же make V=1
должен дать вам полные команды.
Но это зависит от того, как был создан make-файл.
-d
опция может помочь, но даст вам очень длинный вывод.
Поскольку GNU Make версии 4.0, --trace
Аргумент - это хороший способ узнать, что и почему делает make-файл, выводя строки вроде:
makefile:8: target 'foo.o' does not exist
или же
makefile:12: update target 'foo' due to: bar
Использование make V=1
Другие предложения здесь:
make VERBOSE=1
- не сработало по крайней мере из моих испытаний.make -n
- отображает только логическую операцию, а не выполняемую командную строку. НапримерCC source.cpp
make --debug=j
- также работает, но может также включить многопоточное построение, вызывая дополнительный вывод.
Мне нравится использовать:
make --debug=j
Он показывает команды, которые он выполняет:
https://linux.die.net/man/1/make
--debug [= FLAGS] Печать отладочной информации в дополнение к обычной обработке. Если флаги опущены, то поведение такое же, как если бы был указан -d. FLAGS может быть для всех результатов отладки (аналогично использованию -d), b для базовой отладки, v для более подробной базовой отладки, i для показа неявных правил, j для подробностей о вызове команд и m для отладки при повторной обработке make-файлов.
В зависимости от вашей версии automake, вы также можете использовать это:
make AM_DEFAULT_VERBOSITY=1
Ссылка: https://lists.gnu.org/archive/html/bug-autoconf/2012-01/msg00007.html
Примечание: я добавил этот ответ, так как V=1
не работал для меня.
- Если вы хотите увидеть все команды (включая скомпилированные) целевого запуска по умолчанию:
make --always-make --dry-run
make -Bn
- команды show, выполненные при следующем запуске
make
:
make --dry-run
make -n
В этом примере вы можете выбрать цель, отличную от используемой по умолчанию.