[gcc] 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”와 같은 것을 보여줍니다. 이 동작을 제어하는 ​​방법을 잘 모르겠습니다.



답변

호출하려면 건조 실행 :

make -n

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


답변

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

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

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


답변

시스템 독립적 방법 구축

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를 사용 : 나는 정확한 명령을 볼 수 있습니까?


답변

GNU Make 버전 4.0부터이 --trace인수는 makefile이 무엇을, 왜 하는지를 알려주는 좋은 방법으로 다음과 같은 행을 출력합니다.

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명령 호출에 대한 세부 사항mmakefile을 재생하는 동안 디버깅을위한 것일 수 있습니다.


답변

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

make AM_DEFAULT_VERBOSITY=1

참조 : AM_DEFAULT_VERBOSITY

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