Estou passando por um pgm, por exemplo, para criar um arquivo 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 como compilar este programa.
hello
está atualizado. Mudeclean
pararm -f *.o hello
antes de fazer algo inesperado, depois executemake clean all
e veja se funciona..phony: all clean
, uma vez queall
eclean
não são nomes de arquivo.Respostas:
Às vezes, o erro "Nada a fazer para todos" pode ser causado por espaços antes do comando na regra makefile em vez de tab. Certifique-se de usar tabulações em vez de espaços dentro de suas regras.
ao invés de
Por favor, consulte o GNU make manual para a descrição da sintaxe da regra: https://www.gnu.org/software/make/manual/make.html#Rule-Syntax
fonte
all : src/server/mod_wsgi.la
, e mudei paraall : </t> src/server/mod_wsgi.la
. Agora recebo o erro:make: execvp: src/server/mod_wsgi.la: Permission denied Makefile:29: recipe for target 'all' failed make: *** [all] Error 127
depoissudo make
. Qualquer ajuda?Remova o
hello
arquivo de sua pasta e tente novamente.O
all
alvo depende dohello
alvo. Ohello
destino primeiro tenta encontrar o arquivo correspondente no sistema de arquivos. Se ele encontrar e estiver atualizado com os arquivos dependentes, não há nada a fazer.fonte
Quando você apenas 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. Portanto, 'make' tenta ver se esses arquivos estão presentes.
Se eles estiverem presentes, 'make' vê se suas dependências, por exemplo, main.o tem uma dependência main.c, foram alteradas. Se eles mudaram, o make reconstrói, senão pula a regra. Da mesma forma, ele continua construindo recursivamente os arquivos que foram alterados e finalmente executa o comando principal, "all" no seu caso para fornecer um executável, 'hello' no seu caso.
Se eles não estiverem presentes, faça cegamente constrói tudo sob a regra.
Voltando ao seu problema, não é um erro, mas 'make' está dizendo que todas as dependências em seu makefile estão atualizadas e não é necessário fazer nada!
fonte
Make está se comportando corretamente.
hello
já existe e não é mais antigo que os.c
arquivos e, portanto, não há mais trabalho a ser feito. Existem quatro cenários em que o make precisará (re) construir:.c
arquivos, ele será mais recente do quehello
e terá que ser reconstruído ao executar make.hello
, obviamente terá que reconstruí-lo-B
opção.make -B all
make clean all
irá deletarhello
e requerer uma reconstrução. (Eu sugiro que você dê uma olhada no comentário de @Mat sobrerm -f *.o hello
fonte
Acho que você perdeu uma guia na 9ª linha. A linha após all: hello deve ser uma guia em branco. Certifique-se de ter uma guia em branco na 9ª linha. Isso fará com que o interpretador entenda que você deseja usar a receita padrão para makefile.
fonte
Isso não é um erro; o comando make no unix funciona com base nos carimbos de data / hora. Ou seja, digamos que você tenha feito certas alterações
factorial.cpp
e compilado usando omake
make mostra a informação de que apenas occ -o factorial.cpp
comando é executado. Da próxima vez, se você executar o mesmo comando, ou seja,make
sem fazer nenhuma alteração em nenhum arquivo com.cpp
extensão, o compilador diz que o arquivo de saída está atualizado. O compilador fornece essas informações até que façamos certas alterações em qualquer umfile.cpp
.A vantagem do
makefile
é que ele reduz o tempo de recompilação, compilando os únicos arquivos que são modificados e usando os.o
arquivos object ( ) dos arquivos não modificados diretamente.fonte
Cheguei a esse erro peculiar e difícil de depurar por um caminho diferente. Meu problema acabou sendo que eu estava usando uma regra de padrão em uma etapa de compilação quando o destino e a dependência estavam localizados em diretórios distintos. Algo assim:
Eu tinha várias dependências configuradas dessa forma e estava tentando usar uma receita de padrão para todas elas. Claramente, uma única substituição para "%" não vai funcionar aqui. Fiz regras explícitas para cada dependência e me vi de volta entre os cachorros e unicórnios!
Espero que isso ajude alguém!
fonte