컴파일 문제를 디버깅하려고하는데 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에서 사용하는 기본 쉘 이지만 SHELL
make 변수 로 변경할 수 있다는 점을 확인해야한다는 것입니다.
이렇게 sh -v
멋진뿐만 아니라 겠지만, 대시 0.5.7 (우분투 14.04는 sh
)에 대한 무시 -c
(방법 것 같다하는 명령 make
은 아무것도하지 않도록 사용을).
make -p
설정 변수의 값을 인쇄하는 관심도 있습니다.
CMake가 생성 한 Makefile
make VERBOSE=1
답변
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
명령 호출에 대한 세부 사항 및 m
makefile을 재생하는 동안 디버깅을위한 것일 수 있습니다.
답변
automake 버전에 따라 다음을 사용할 수도 있습니다.
make AM_DEFAULT_VERBOSITY=1
참조 : AM_DEFAULT_VERBOSITY
참고 :이 답변 V=1
은 저에게 효과가 없으므로 추가했습니다 .