gcc - 실행 - makefile이란




make/gcc가 명령을 내도록하려면 어떻게해야합니까? (5)

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


GNU Make 버젼 4.0 이후, --trace 인자는 메이크 파일이 무엇을 왜 그랬는지를 알려주는 좋은 방법입니다.

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

또는

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


나는 다음과 같이 사용한다 :

make --debug=j

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

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

--debug [= FLAGS] 일반적인 처리 외에 디버깅 정보를 출력합니다. FLAGS를 생략하면 -d가 지정된 것과 동일한 동작을합니다. FLAGS는 모든 디버깅 출력 (-d 사용과 동일), b 기본 디버깅, v보다 자세한 기본 디버깅, i 암시 적 규칙 표시, 명령 호출 세부 사항 및 m 메이크 파일을 다시 작성하는 동안의 디버깅 용일 수 있습니다.


make V=1

여기에 다른 제안 :

  • make VERBOSE=1 - 적어도 시련에서는 효과가 없었습니다.
  • make -n - 논리 연산 만 표시하고 명령 행은 실행하지 않습니다. 예 : CC source.cpp

  • make --debug=j - 역시 잘 동작하지만 다중 스레드 빌드를 가능하게하여 추가 출력을 유발할 수 있습니다.


시스템 독립적 방법 구축

make SHELL='sh -x'

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

a:
    @echo a

산출:

+ echo a
a

이것은 make 위한 특별한 SHELL 변수를 make 하고, -xsh 를 실행하기 전에 확장 된 줄을 출력하도록 지시한다.

-n 에 대한 한 가지 이점은 실제로 명령을 실행한다는 것입니다. 일부 프로젝트 (예 : Linux 커널)에서 -n 이 종속성 문제 때문에 평상시보다 훨씬 빨리 실행을 중단 할 수 있음을 발견했습니다.

이 방법의 단점은 사용되는 쉘이 sh 인 것을 확인해야한다는 것입니다. sh 는 Make가 POSIX 일 때 사용하는 기본 SHELL 이지만 SHELL make 변수로 변경할 수 있습니다.

sh -v 하면 멋지지만 Dash 0.5.7 (Ubuntu 14.04 sh )에서는 -c 명령 ( make 사용하는 것처럼 보입니다)을 무시하므로 아무 것도하지 않습니다.

make -p 는 set 변수의 값을 출력하는 데에도 도움이됩니다.

CMake 생성 된 Makefile

make VERBOSE=1

참고 : GNU Make와 함께 CMake 사용하기 : 정확한 명령을 보려면 어떻게해야합니까?







verbosity