Um makefile é um arquivo de texto referenciado pelo comando make que descreve a construção dos destinos e contém informações, tais como dependência de nível de origem e dependências de ordem de construção.
O CDT pode gera um makefile para você; tais projetos são chamados de projeto de Construção Gerenciada. Alguns projetos, conhecidos como projetos de Construção Padrão, permitem que você defina seu próprio makefile.
# Um Arquivo Pronto de amostra # Esse Arquivo Pronto demonstra e explica as # Macros de Construção, as Expansões de Macro, # as Regras, os Destinos, as Dependências, os Comandos, os Objetivos # os Destinos Artificiais, a Regra Padrão e a Regra de Dependência. # Os comentários começam com um # e vão para o final da linha. # Esta é uma Macro de Construção simples. LINK_TARGET = test_me.exe # Esta é uma Macro de Construção que utiliza a barra invertida para estender várias linhas. # Isso permite a modificação rápida de mais arquivos de objeto. OBJS = \ Test1.o \ Test2.o \ Main.o # Esta é uma Macro de Construção definida por duas Expensões de Macro. # Uma Expansão de Macro pode ser tratada como uma substituição textual da Macro de Construção. # As Expansões de Macro são introduzidas com $ e colocadas entre (parênteses). REBUILDABLES = $(OBJS) $(LINK_TARGET) # As Macros de Construção não precisam ser definidas antes das Expansões de Macro, # mas elas devem ser normalmente definidas antes de serem exibidas em qualquer Regra. # Conseqüentemente, as Macros de Construção são exibidas primeiro em um Makefile. # Esta é uma Regra simples (utilizada para "limpar" seu ambiente de construção). # Ela tem um Destino chamado "clean" (à esquerda dos dois-pontos ":" na primeira linha), # não tem nenhuma Dependência (à direita dos dois-pontos), # e tem dois Comandos (recuados por tabulações nas linhas que se seguem). # O espaço antes dos dois-pontos não é necessário, mas foi incluído aqui para se obter maior clareza. clean : rm -f $(REBUILDABLES) echo Clean done # Os Destinos padrão que o Arquivo Pronto provavelmente deve ter são: # "all" e "clean", porque eles são freqüentemente Objetivos da linha de comandos. # Além disso, esses são normalmente Destinos Artificiais, porque eles não # correspondem a arquivos reais chamados "all" ou "clean". # A regra para "all" é utilizada para construir seu sistema de forma incremental. # Ela faz isso expressando uma dependência nos resultados daquele sistema, # que, por sua vez, tem suas próprias regras e dependências. all : $(LINK_TARGET) echo All done # Não há nenhuma ordem exigida para a lista de regras, conforme elas aparecem no Makefile. # A construção construirá sua própria árvore de dependência e executará cada regra somente # uma vez quando suas regras de dependência tiverem sido executadas com sucesso. # A seguir está uma Regra que utiliza algumas Macros de Construção incorporadas em seu comando: # $@ expande para o destino da regra, nesse caso "test_me.exe". # $^ expande para as dependências de regra, nesse caso os três arquivos # main.o, test1.o e test2.o. $(LINK_TARGET) : $(OBJS) g++ -g -o $@ $^ # Esta é uma Regra Padrão freqüentemente utilizada para a linha de compilação. # Ela indica como criar um arquivo com um sufixo .o, fornecendo um arquivo com o sufixo .cpp. # O comando de regras utiliza somente Macros de Construção incorporadas: # $@ para o destino de correspondência padrão # $lt; para a dependência de correspondência padrão %.o : %.cpp g++ -g -o $@ -c $< # Estas são as Regras de Dependência, que são regras sem nenhum comando. # As Regras de Dependência indicam que se qualquer arquivo à direita dos dois-pontos for alterado, # o destino à esquerda dos dois-pontos deverá ser considerado desatualizado. # Os comandos para atualizar um destino desatualizado podem ser localizados em qualquer lugar # (nesse caso, pela Regra Padrão acima). # As Regras de Dependência são freqüentemente utilizadas para capturar as dependências de arquivo de cabeçalho. Main.o : Main.h Test1.h Test2.h Test1.o : Test1.h Test2.h Test2.o : Test2.h # De modo alternativo, para capturar manualmente as dependências, existem vários # geradores de dependências automatizados. Aqui está uma possibilidade (comentado)... # %.dep : %.cpp # g++ -M $(FLAGS) $< > $@ # include $(OBJS:.o=.dep)
P1. A visualização Meu Console diz "Erro ao ativar o construtor". O que isso significa?
Erro ao ativar o construtor (make -k clean all ) (Exec erro: falha na ativação)
O mais provável é que o comando de construção (por padrão "make") não está no caminho. Você pode colocá-lo no caminho e reiniciar o Eclipse.
Você também pode alterar o comando de construção para algo que estiver no seu caminho. Se você estiver utilizando as ferramentas MinGW para compilação, será necessário substituir o comando de construção por "mingw32-make".
P2. A visualização Meu Console diz "Não há nenhuma regra para construir destino 'X'".
make -k clean all make: *** Não há nenhuma regra para construir o destino 'clean'. make: *** Não há nenhuma regra para construir o destino 'all'.
Por padrão, o programa de construção procura um arquivo chamado normalmente de "Arquivo Pronto" ou "arquivo pronto". Se não for possível localizar tal arquivo no diretório de trabalho ou se esse arquivo estiver vazio ou se o arquivos não contiver regras para os objetivos da linha de comandos ("clean" e "all" nesse caso), haverá uma falha com uma mensagem de erro semelhante àquelas mostradas.
Se você já tiver um Makefile válido, poderá precisar alterar o diretório de trabalho da construção. O diretório de trabalho padrão para o comando de construção é o diretório raiz do projeto. Você pode alterar isso especificando um Diretório de Construção alternativo nas propriedades do Projeto Make. Ou se o Arquivo Pronto tiver outro nome (por exemplo, buildFile.mk), você poderá especificar o nome definindo o comando de Construção padrão para make -f buildFile.mk.
Se você não tiver um Makefile Válido, crie um novo arquivo chamado Makefile no diretório raiz. Você pode, em seguida, incluir o conteúdo do Makefile de amostra (acima) e modificá-lo conforme apropriado.
P3. A visualização Meu Console diz "separador ausente".
make -k clean all makefile:12: *** separador ausente. Pare.
A sintaxe padrão dos Arquivos de Construção indica que cada linha em uma regra de construção deve ser precedida por um caracter de tabulação. Esse caractere de tabulação é substituído acidentalmente, e com freqüência, por espaços e, porque ambos resultam em um recuo de espaço em branco, esse problema é facilmente controlado. Na amostra fornecida, a mensagem de erro pode ser indicada na linha 12 do "arquivo pronto"; para corrigir problemas, insira uma tabulação no início daquela linha.
P4. A visualização Meu Console "O destino 'all' não foi refeito devido a erros".
make -k clean all make: *** [clean] Error 255 rm -f Test1.o Test2.o Main.o test_me.exe g++ -g -o Test1.o -c Test1.cpp make: *** [Test1.o] Error 255 make: *** [Test2.o] Error 255 make: *** [Main.o] Error 255 g++ -g -o Test2.o -c Test2.cpp g++ -g -o Main.o -c Main.cpp make: Destino 'all' não refeito devido a erros.
A causa provável aqui é o fato de g++ não estar no Caminho.
O Erro 255 é gerado pela construção como um resultado desse shell de comando não poder localizar um comando para uma regra específica.
As mensagens do fluxo de erro padrão (as linhas indicando Erro 255) e do fluxo de saída padrão (todas as outras linhas) são mescladas na visualização Console.
P5. O que significa o sinalizador -k?
O sinalizador -k instrui a construção a continuar fazendo outras regras independentes, mesmo quando uma regra falha. Isso é útil para os grandes projetos de construção.
Você pode remover o sinalizador -k, ativando Propriedades do Projeto > Projeto de Construção C/C++ > Construtor > Parar no primeiro erro de construção
P6. Minha visualização Console é semelhante a:
mingw32-make clean all process_begin: CreateProcess((null), rm -f Test1.o Test2.o Main.o test_me.exe, ...) com falha. make (e=2): O sistema não pode localizar o arquivo especificado. mingw32-make: *** [clean] Error 2 rm -f Test1.o Test2.o Main.o test_me.exe
Isso significa que mingw32-make não pôde localizar o utilitário "rm". Infelizmente, MinGW não é fornecido com "rm". Para corrigir isso, substitua a regra clean no Arquivo de Pronto por:
clean : -del $(REBUILDABLES) echo Clean done
O sinal de menos à esquerda instrui a construção para considerar a regra clean um sucesso, mesmo se o comando del retornar um defeito. Isso pode ser aceitável desde que o comando del falhe se os arquivos especificados para serem excluídos não existirem mais.