it-swarm-pt.tech

make: Nada a ser feito para `all '

Eu estou passando por um pgm por exemplo, para criar um arquivo de make.

http://mrbook.org/tutorials/make/

Minha pasta eg_make_creation contém os seguintes arquivos,

desktop:~/eg_make_creation$ ls
factorial.c  functions.h  hello  hello.c  main.c  Makefile

Makefile

# I am a comment, and I want to say that the variable CC will be
# the compiler to use.
CC=gcc
# Hwy!, I am comment no.2. I want to say that CFLAGS will be the
#options I'll pass to the compiler
CFLAGS=-c -Wall

all:hello

hello:main.o factorial.o hello.o
  $(CC) main.o factorial.o hello.o -o hello

main.o:main.c
  $(CC) $(CFLAGS) main.c

factorial.o:factorial.c
  $(CC) $(CFLAGS) factorial.c

hello.o:hello.c
  $(CC) $(CFLAGS) hello.c

clean:
  rm -rf *o hello

erro:

desktop:~/eg_make_creation$ make all
make: Nothing to be done for `all'.

Por favor me ajude a entender para compilar este programa.

80
Angus

Às vezes, o erro "Nada a ser feito para todos" pode ser causado por espaços antes do comando na regra makefile, e não na guia. Por favor, certifique-se de usar guias em vez de espaços dentro de suas regras.

all:
<\t>$(CC) $(CFLAGS) ...

ao invés de

all:
    $(CC) $(CFLAGS) ...

Por favor, veja o GNU make manual para a descrição da sintaxe da regra: https://www.gnu.org/software/make/manual/make.html#Rule-Syntax

95
VirtualVDX

Remova o arquivo hello da sua pasta e tente novamente.

O destino all depende do destino hello. O alvo hello primeiro tenta encontrar o arquivo correspondente no sistema de arquivos. Se encontrar e estiver atualizado com os arquivos dependentes - não há nada a fazer.

27
weekens

Quando você simplesmente dá make, ele cria a primeira regra em seu makefile, ou seja, "all". Você especificou que "all" depende de "hello", que depende de main.o, factorial.o e hello.o. Então, 'make' tenta ver se esses arquivos estão presentes.

Se eles estiverem presentes, 'make' verá se suas dependências, por exemplo, main.o tem uma dependência main.c, mudou. Se eles tiverem sido alterados, faça-os reconstruí-los, caso contrário, ignore a regra. Da mesma forma, recursivamente vai na construção dos arquivos que foram alterados e, finalmente, executa o comando mais alto, "tudo" no seu caso para lhe dar um executável, 'olá' no seu caso.

Se eles não estiverem presentes, construa cegamente tudo sob a regra.

Chegando ao seu problema, não é um erro, mas 'make' está dizendo que toda dependência em seu makefile está atualizada e não precisa fazer nada!

18
Chethan Ravindranath

O make está se comportando corretamente. hello já existe e não é mais antigo que os arquivos .c e, portanto, não há mais trabalho a ser feito. Existem quatro cenários em que o make precisará (re) construir:

  • Se você modificar um de seus arquivos .c, ele será mais recente que hello e, em seguida, ele precisará ser reconstruído quando você executar o make.
  • Se você apagar hello, então obviamente terá que reconstruí-lo
  • Você pode forçar make a reconstruir tudo com a opção -B. make -B all
  • make clean all excluirá hello e exigirá uma reconstrução. (Sugiro que você olhe para o comentário do @ Mat sobre rm -f *.o hello
14
Aaron McDaid

Eu acho que você perdeu uma aba na 9ª linha. A linha seguinte all: hello deve ser um separador em branco. Certifique-se de que você tenha uma guia em branco na 9ª linha. Isso fará com que o intérprete entenda que você deseja usar a receita padrão do makefile.

4
Techie

Isso não é um erro que o comando make em unix funciona com base nos timestamps, ou seja, vamos dizer se você fez certas mudanças em fatorial.cpp e compilar usando make.. then make mostra a informação de que apenas o fatorial cc -o. cpp ** comando é executado .Na próxima vez, se você executar o mesmo comando ou seja, fazer sem fazer qualquer alteração em qualquer arquivo com extensão .cpp, em seguida, o compilador diz que o arquivo de saída está atualizado ... o compilador dá essa informação até que façamos certas alterações em qualquer arquivo.cpp. A vantagem do arquivo make é que ele reduz o tempo de recompilação compilando os únicos arquivos que são modificados e usando diretamente os arquivos de objeto (.o) dos arquivos não modificados ......

4
muneshwar