make / GCC가 명령을 표시하도록하려면 어떻게해야합니까?


277

컴파일 문제를 디버깅하려고하는데 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"와 같은 것을 보여줍니다. 이 동작을 제어하는 ​​방법을 잘 모르겠습니다.


makefile을 실행 중 gcc입니까 , 아니면 명령 만 실행 중입니까?
Blender

20
이것은 Kbuild 또는 Autotools 출력 처럼 보입니다 . 시도하십시오 make V=1.
jww

답변:


275

호출하려면 건조 실행 :

make -n

make수행하려는 작업 이 표시됩니다 .


31
발견 :) make V = 1 위의 "make -n"제안도 효과가있었습니다. :) 답변 해 주셔서 감사합니다.
hernejj

76
차이점은 make -n명령을 실행하지 않는다는 것입니다. 따라서 정답은make V=1
m-ric

20
make V=1Makefile이 지원하는 경우에만 작동합니다. automake의 makefile은 그렇게하지만 많은 다른 사람들은 그렇지 않습니다.
larsr

53
CMake의 경우 make VERBOSE=1;를 사용하십시오 . GNU autotools 용 make V=1.
Ruslan

10
@ m-ric 실제로 명령을 실행하려면 다음을 고려하십시오 make SHELL='sh -x'. stackoverflow.com/a/32010960/895245
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

175

autotools에 의해 생성 된 라이브러리 makefile ( ./configure발급해야 함)에는 종종 자세한 옵션이 있으므로 기본적으로 전체 명령을 사용 make VERBOSE=1하거나 make V=1제공해야합니다.

그러나 이것은 makefile이 생성 된 방법에 따라 다릅니다.

-d옵션이 도움 이 될 수 있지만 매우 긴 출력을 제공합니다.


60
참고 : CMake에서 생성 한 Makefile은을 지원 VERBOSE=1하지 않습니다 V=1.
blinry

3
V = 1은 mips-linux-gnu-gcc로 nuttx를 컴파일하여 나를 위해 일했습니다. 감사합니다.
jcomeau_ictx

141

시스템 독립적 방법 구축

make SHELL='sh -x'

또 다른 옵션입니다. 샘플 Makefile:

a:
    @echo a

산출:

+ echo a
a

이것은 특별 설정 SHELL에 대한 변수를 make하고 -x이야기 sh를 실행하기 전에 확장 라인을 인쇄 할 수 있습니다.

한 가지 장점 -n은 실제로 명령을 실행한다는 것입니다. 나는 -n의존성 문제로 인해 평소보다 훨씬 일찍 실행을 멈출 수있는 일부 프로젝트 (예 : Linux 커널)의 경우를 발견했습니다 .

이 방법의 한 가지 단점은 사용할 쉘 sh이 POSIX이므로 Make에서 사용하는 기본 쉘 이지만 SHELLmake 변수 로 변경할 수 있다는 점을 확인해야한다는 것입니다.

이렇게 sh -v멋진뿐만 아니라 겠지만, 대시 0.5.7 (우분투 14.04는 sh)에 대한 무시 -c(방법 것 같다하는 명령 make은 아무것도하지 않도록 사용을).

make -p 설정 변수의 값을 인쇄하는 관심도 있습니다.

CMake가 생성 한 Makefile

make VERBOSE=1

참조 : GNU 제조사와 CMake를 사용 : 나는 정확한 명령을 볼 수 있습니까?


11
원래 Makefile이 얼마나 잘 작성 / 생성되었는지에 의존하지 않는 최상의 답변
nodakai

2
누구나
공감대를

make SHELL='$$SHELL -x'$SHELL평가되지 않은 리터럴을 만듭니다 . 사용 make SHELL="$SHELL -x"이 작동합니다.
Rick van der Zwet

1
이 답변은 cmake 사용에 의존하지 않는 다른 답변과 달리 가장 일반적인 답변입니다.
Mike76

2
SHELL = 'sh -x'를 슈퍼로 만드십시오!
Jackie Yeh

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

20

사용하다 make V=1

다른 제안 사항은 다음과 같습니다.

  • make VERBOSE=1 -적어도 내 시험에서 작동하지 않았습니다.
  • make -n-실행중인 명령 줄이 아닌 논리적 작업 만 표시합니다. 예 :CC source.cpp

  • make --debug=j -잘 작동하지만 멀티 스레드 건물을 활성화하여 추가 출력을 유발할 수도 있습니다.


4
make VERBOSE=1CMake입니다. 시험판은 GNU autotools 기반 프로젝트를 사용했을 가능성이 높습니다.
Ruslan

12

나는 사용하고 싶다 :

make --debug=j

실행되는 명령을 보여줍니다.

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

--debug [= 플래그]

일반적인 처리 외에 디버깅 정보를 인쇄하십시오. FLAGS를 생략하면 동작은 -d지정된 것과 동일 합니다. FLAGS는 모든 디버깅 출력 (을 사용하는 것과 동일 -d), b기본 디버깅, v더 자세한 기본 디버깅, i암시 적 규칙 표시, j명령 호출에 대한 세부 사항mmakefile을 재생하는 동안 디버깅을위한 것일 수 있습니다.


7

automake 버전에 따라 다음을 사용할 수도 있습니다.

make AM_DEFAULT_VERBOSITY=1

참조 : AM_DEFAULT_VERBOSITY

참고 :이 답변 V=1은 저에게 효과가 없으므로 추가했습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.