Я пытаюсь отладить проблему компиляции, но я не могу заставить 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". Я не уверен, как контролировать это поведение.
gcc
команду?make V=1
.Ответы:
Чтобы вызвать пробный прогон :
Это покажет, что
make
пытается сделать.источник
make -n
не выполняет команды. Таким образом, правильный ответmake V=1
make V=1
работает только если Makefile поддерживает это. Это делают make-файлы automake, но многие другие этого не делают.make VERBOSE=1
; для автоинструментов GNUmake V=1
.make SHELL='sh -x'
: stackoverflow.com/a/32010960/895245Библиотечные make-файлы, которые генерируются автоматическими инструментами (которые
./configure
вы должны выпустить), часто имеют подробный вариант, поэтому, в основном, используютmake VERBOSE=1
илиmake V=1
должны давать вам полные команды.Но это зависит от того, как был создан make-файл.
-d
Вариант может помочь, но это даст вам очень длинный выход.источник
VERBOSE=1
, но не поддерживаютV=1
.Построить системно-независимый метод
это еще один вариант. Образец
Makefile
:Вывод:
Это устанавливает специальную
SHELL
переменную дляmake
и-x
говоритsh
распечатать расширенную строку перед ее выполнением.Одним из преимуществ
-n
является то, что на самом деле запускает команды. Я обнаружил, что для некоторых проектов (например, ядра Linux), которые-n
могут перестать работать намного раньше, чем обычно, возможно, из-за проблем с зависимостями.Недостатком этого метода является то, что вы должны убедиться, что будет использоваться оболочка, которая используется
sh
по умолчанию для Make, поскольку они являются POSIX, но могут быть изменены с помощьюSHELL
переменной make.Делать
sh -v
это было бы тоже здорово, но Dash 0.5.7 (Ubuntu 14.04sh
) игнорирует-c
команды (что, похоже,make
использует их), поэтому ничего не делает.make -p
Также вас заинтересует, что выводит значения заданных переменных.Созданные CMake Makefiles
Смотрите: Использование CMake с GNU Make: Как я могу увидеть точные команды?
источник
SHELL='$$SHELL -x'
создаст$SHELL
литерал, который не оценивается. Использованиеmake SHELL="$SHELL -x"
будет работать.Начиная с GNU Make версии 4.0, этот
--trace
аргумент является хорошим способом сказать, что и почему делает make-файл, выводя такие строки:или
источник
использование
make V=1
Другие предложения здесь:
make VERBOSE=1
- не сработало по крайней мере из моих испытаний.make -n
- отображает только логическую операцию, а не выполняемую командную строку. НапримерCC source.cpp
make --debug=j
- также работает, но может также включить многопоточное построение, вызывая дополнительный вывод.источник
make VERBOSE=1
это для CMake. Ваши испытания были, скорее всего, с GNU autotools проектов.Мне нравится использовать:
Он показывает команды, которые он выполняет:
https://linux.die.net/man/1/make
--debug [=] ФЛАГИ
Печать отладочной информации в дополнение к обычной обработке. Если флаги опущены, то поведение такое же, как если бы
-d
было указано. FLAGS может быть для всех выходных данных отладки (так же, как и для использования-d
),b
для базовой отладки,v
для более подробной базовой отладки,i
для показа неявных правил,j
для подробностей о вызове команд иm
для отладки при повторной обработке make-файлов.источник
В зависимости от вашей версии automake, вы также можете использовать это:
Ссылка: AM_DEFAULT_VERBOSITY
Примечание: я добавил этот ответ, так
V=1
как у меня не работает.источник