Як змусити make / GCC показати мені команди?


276

Я намагаюся налагодити проблему компіляції, але я не можу отримати GCC (або, можливо, це зроблено ??), щоб показати мені фактичні команди компілятора та лінкера, які він виконує.

Ось результат, який я бачу:

  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". Я не впевнений, як контролювати таку поведінку.


У вас працює makefile чи просто gccкоманда?
Блендер

20
Це схоже на вихід Kbuild або Autotools . Спробуйте make V=1.
jww

Відповіді:


275

Щоб викликати сухий пробіг :

make -n

Це покаже, що makeнамагаються зробити.


30
Знайшов це :) make V = 1 Хоча вищенаведена пропозиція "make -n" також спрацювала. :) Дякую всім за відповіді.
hernejj

75
Різниця в тому, що make -nкоманди не виконують. Таким чином, правильна відповідьmake V=1
m-ric

19
make V=1працює лише в тому випадку, якщо Makefile підтримує його. Машини автоматів роблять це, але багато інших не роблять.
larsr

53
Для CMake використовуйте make VERBOSE=1; для GNU Autotools make V=1.
Руслан

10
@ М-РВК , якщо ви хочете запустити на самому справі виконання команд, розглянемо make SHELL='sh -x': stackoverflow.com/a/32010960/895245
Чіро Сантіллі郝海东冠状病六四事件法轮功

175

Бібліотечні файли, які генеруються автоінструментами ( ./configureвам доведеться видати), часто мають багатослівний варіант, тому, в основному, використовуйте make VERBOSE=1або make V=1повинні дати вам повні команди.

Але це залежить від того, як створювався makefile.

The -dВаріант може допомогти, але це дасть вам дуже довгий вихід.


60
Примітка: Makefiles, створені CMake, підтримують лише VERBOSE=1, але не V=1.
блін

3
V = 1 працював для мене, компілюючи nuttx з mips-linux-gnu-gcc, дякую.
jcomeau_ictx

141

Побудувати систему незалежним методом

make SHELL='sh -x'

інший варіант. Зразок Makefile:

a:
    @echo a

Вихід:

+ echo a
a

Це встановлює спеціальну SHELLзмінну для makeі -xповідомляєsh роздрукувати розширений рядок перед його виконанням.

Одна перевага в -nтому, що насправді виконує команди. Я виявив, що для деяких проектів (наприклад, ядро ​​Linux) це-n можуть перестати працювати набагато раніше, ніж зазвичай, можливо, через проблеми залежності.

Одним із недоліків цього методу є те, що ви повинні переконатися, що оболонка, яка буде використовуватися sh, є типовою, яку використовує Make, оскільки вони є POSIX, але її можна змінити за допомогоюSHELL змінної make.

Робити це також sh -vбуло б круто, але Dash 0.5.7 (Ubuntu 14.04 sh) ігнорує -cкоманди (що, здається, якmake використовується), тому нічого не робить.

make -p Вас також зацікавить, що друкує значення встановлених змінних.

CMake, створений Makefiles

make VERBOSE=1

Див.: Використання CMake з GNU Make: Як я бачу точні команди?


11
Однозначно найкраща відповідь, яка не залежить від того, наскільки добре написано / сформовано оригінальний Makefile
nodakai

2
Якщо хтось може пояснити сутичку, дайте мені знати, щоб я міг дізнатися та покращити інформацію ;-)
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

make SHELL='$$SHELL -x'зробить $SHELLбуквальне, що не оцінюється. Використання make SHELL="$SHELL -x"буде працювати.
Rick van der Zwet

1
це найкраща загальна відповідь, на відміну від деяких інших відповідей це не залежить від використання cmake
Mike76

2
зробити SHELL = 'sh -x' - це супер!
Джекі Єх

22

Оскільки GNU Make версії 4.0, --traceаргумент є хорошим способом сказати, що і чому роблять makefile, виводячи рядки типу:

makefile:8: target 'foo.o' does not exist

або

makefile:12: update target 'foo' due to: bar

1
Цей аргумент друкує більш детальну інформацію, ніж сухий хід. Дуже корисно зрозуміти зробити системи, які мають складний процес збирання, як dpdk.
makerj

19

Використовуйте make V=1

Інші пропозиції тут:

  • make VERBOSE=1 - не працював принаймні з моїх випробувань.
  • make -n- відображає лише логічну операцію, а не виконується командний рядок. НапрCC source.cpp

  • make --debug=j - також працює, але може також дозволити багатопотокове будівництво, викликаючи додатковий вихід.


4
make VERBOSE=1призначений для CMake. Ваші випробування, швидше за все, стосувалися проектів на базі автоінструментів GNU.
Руслан

12

Мені подобається використовувати:

make --debug=j

Він показує команди, які він виконує:

https://linux.die.net/man/1/make

--debug [= ФЛАГИ]

Друкуйте інформацію про налагодження на додаток до звичайної обробки. Якщо ФЛАГИ опущені, то поведінка така сама, як якщо б -dбула вказана. FLAGS може бути для всіх результатів налагодження (так само, як і використання -d), bдля базової налагодження, vдля більш детальної основної налагодження, iдля відображення неявних правил, jдля деталізації виклику команд таm для налагодження під час перестановки файлів.


7

Залежно від версії автоматичного автоматичного використання, ви також можете скористатися цим:

make AM_DEFAULT_VERBOSITY=1

Довідка: AM_DEFAULT_VERBOSITY

Примітка. Цю відповідь я додав, оскільки V=1не працював для мене.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.