Estou tentando depurar um problema de compilação, mas não consigo obter o GCC (ou talvez seja make ??) para me mostrar os comandos reais do compilador e vinculador que está sendo executado.
Aqui está a saída que estou vendo:
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
O que eu quero ver deve ser semelhante a este:
$ 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
Observe como este exemplo tem o gcc
comando completo exibido. O exemplo acima mostra apenas coisas como "CCLD libvirt_parthelper". Não tenho certeza de como controlar esse comportamento.
gcc
comando?make V=1
.Respostas:
Para invocar uma execução a seco :
Isso mostrará o que
make
está tentando fazer.fonte
make -n
não executa os comandos. A resposta correta émake V=1
make V=1
está funcionando apenas se o Makefile suportar. os makefiles da automake fazem isso, mas muitos outros não.make VERBOSE=1
; para ferramentas automáticas GNUmake V=1
.make SHELL='sh -x'
: stackoverflow.com/a/32010960/895245Os makefiles da biblioteca, que são gerados pelas ferramentas automáticas (o que
./configure
você precisa emitir) geralmente têm uma opção detalhada, portanto, basicamente, usarmake VERBOSE=1
oumake V=1
deve fornecer os comandos completos.Mas isso depende de como o makefile foi gerado.
A
-d
opção pode ajudar, mas fornecerá uma saída extremamente longa.fonte
VERBOSE=1
, nãoV=1
.Construir método independente do sistema
é outra opção. Amostra
Makefile
:Resultado:
Isso define a
SHELL
variável especial paramake
e-x
informash
para imprimir a linha expandida antes de executá-la.Uma vantagem
-n
é que ele realmente executa os comandos. Eu descobri que em alguns projetos (por exemplo, kernel do Linux) que-n
podem parar de funcionar muito mais cedo do que o habitual, provavelmente devido a problemas de dependência.Uma desvantagem desse método é que você deve garantir que o shell que será usado
sh
seja o padrão usado pelo Make como eles são POSIX, mas pode ser alterado com aSHELL
variável make.Fazer
sh -v
seria legal também, mas o Dash 0.5.7 (Ubuntu 14.04sh
) ignora os-c
comandos (que parece ser como omake
usa) para que não faça nada.make -p
também lhe interessará, que imprime os valores das variáveis definidas.Makefiles gerados pelo CMake
Consulte: Usando o CMake com o GNU Make: Como posso ver os comandos exatos?
fonte
SHELL='$$SHELL -x'
tornará$SHELL
literal o que não é avaliado. Usarmake SHELL="$SHELL -x"
funcionará.Desde o GNU Make versão 4.0, o
--trace
argumento é uma boa maneira de dizer o que e por que um makefile faz, exibindo linhas como:ou
fonte
Usar
make V=1
Outras sugestões aqui:
make VERBOSE=1
- não funcionou pelo menos nos meus ensaios.make -n
- exibe apenas operação lógica, não linha de comando sendo executada. Por exemploCC source.cpp
make --debug=j
- funciona também, mas também pode ativar a construção com vários segmentos, causando saída extra.fonte
make VERBOSE=1
é para o CMake. Suas avaliações foram provavelmente realizadas com projetos baseados em ferramentas automáticas GNU.Eu gosto de usar:
Mostra os comandos que executa:
https://linux.die.net/man/1/make
--debug [= BANDEIRAS]
Imprima informações de depuração além do processamento normal. Se os FLAGS forem omitidos, o comportamento será o mesmo que se
-d
foi especificado. FLAGS pode ser um para todas as saídas de depuração (o mesmo que usar-d
),b
para depuração básica , para depuração básicav
mais detalhada,i
para mostrar regras implícitas,j
para detalhes sobre a invocação de comandos em
para depuração enquanto refaz makefiles.fonte
Dependendo da sua versão do automake, você também pode usar este:
Referência: AM_DEFAULT_VERBOSITY
Nota: eu adicionei esta resposta, pois
V=1
não funcionou para mim.fonte