Próbuję debugować problem z kompilacją, ale wydaje mi się, że nie mogę uzyskać GCC (a może jest to make ??), aby pokazać mi rzeczywiste polecenia kompilatora i linkera, które wykonuje.
Oto wynik, który widzę:
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
To, co chcę zobaczyć, powinno być podobne do tego:
$ 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
Zwróć uwagę, jak w tym przykładzie jest wyświetlane pełne gcc
polecenie. Powyższy przykład pokazuje tylko takie rzeczy jak „CCLD libvirt_parthelper”. Nie jestem pewien, jak kontrolować to zachowanie.
gcc
polecenia?make V=1
.Odpowiedzi:
Aby wywołać próbę na sucho :
To pokaże, co
make
próbuje zrobić.źródło
make -n
że nie wykonuje poleceń. Zatem poprawna odpowiedź tomake V=1
make V=1
działa tylko wtedy, gdy plik Makefile go obsługuje. Pliki makake automake robią to, ale wiele innych nie.make VERBOSE=1
; dla autotoolów GNUmake V=1
.make SHELL='sh -x'
: stackoverflow.com/a/32010960/895245Pliki makr bibliotek, które są generowane przez narzędzia automatyczne (
./configure
które musisz wydać) często mają pełną opcję, więc w zasadzie za pomocąmake VERBOSE=1
lubmake V=1
powinny dać ci pełne polecenia.Zależy to jednak od sposobu wygenerowania pliku makefile.
Ta
-d
opcja może pomóc, ale da ci wyjątkowo długi wynik.źródło
VERBOSE=1
nieV=1
.Zbuduj metodę niezależną od systemu
jest inną opcją. Próbka
Makefile
:Wynik:
Ustawia to specjalną
SHELL
zmiennąmake
i-x
nakazujesh
wydrukowanie rozwiniętej linii przed jej wykonaniem.Zaletą
-n
jest to, że faktycznie uruchamia polecenia. Odkryłem, że w przypadku niektórych projektów (np. Jądro Linuksa), które-n
mogą przestać działać znacznie wcześniej niż zwykle, prawdopodobnie z powodu problemów z zależnościami.Jednym minusem tej metody jest to, że musisz upewnić się, że używana będzie powłoka
sh
, która jest domyślną powłoką używaną przez Make, ponieważ są POSIX, ale można ją zmienić za pomocąSHELL
zmiennej make.Robienie
sh -v
byłoby również fajne, ale Dash 0.5.7 (Ubuntu 14.04sh
) ignoruje-c
polecenia (wydaje się,make
że tak to wykorzystuje), więc nic nie robi.make -p
zainteresuje cię również, co drukuje wartości ustawionych zmiennych.CMake wygenerował Makefile
Zobacz: Używanie CMake z GNU Make: Jak mogę zobaczyć dokładne polecenia?
źródło
SHELL='$$SHELL -x'
sprawi, że$SHELL
literał nie będzie oceniany. Korzystaniemake SHELL="$SHELL -x"
będzie działać.Od wersji GNU Make w wersji 4.0
--trace
argument jest dobrym sposobem, aby powiedzieć, co i dlaczego robi makefile, wypisując wiersze takie jak:lub
źródło
Posługiwać się
make V=1
Inne sugestie tutaj:
make VERBOSE=1
- nie działało przynajmniej z moich prób.make -n
- wyświetla tylko operację logiczną, a nie wykonywaną linię poleceń. Na przykładCC source.cpp
make --debug=j
- działa również, ale może również umożliwić budowanie wielowątkowe, powodując dodatkowe wyjście.źródło
make VERBOSE=1
jest dla CMake. Twoje próby najprawdopodobniej dotyczyły projektów opartych na automatycznych narzędziach GNU.Lubię używać:
Pokazuje polecenia, które wykonuje:
https://linux.die.net/man/1/make
--debug [= FLAGI]
Drukuj informacje debugowania oprócz normalnego przetwarzania. Jeśli FLAGI zostaną pominięte, zachowanie będzie takie samo, jak gdyby
-d
zostało określone. Flagi mogą być przeznaczone do wszystkich wyników debugowania (tak samo jak przy użyciu-d
),b
do podstawowego debugowania,v
do bardziej szczegółowego debugowania podstawowego,i
do pokazywania ukrytych reguł,j
do szczegółów dotyczących wywoływania poleceń im
do debugowania podczas ponownego tworzenia plików makefiles.źródło
W zależności od wersji automake możesz także użyć tego:
Odniesienie: AM_DEFAULT_VERBOSITY
Uwaga: dodałem tę odpowiedź, ponieważ
V=1
nie działała dla mnie.źródło