Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

204
Visualizações
Makefile anulando la regla implícita predeterminada

¿Por qué esta regla no puede anular la regla implícita predeterminada?

Cuando se invoca make como: make myapp (supongamos que myapp.c está ahí). El make ejecuta el comando predeterminado para compilar y vincular el programa en lugar de los comandos definidos en esta regla implícita:

 #... omitted code LCUS=$(LIBS)/libcus.a #... omitted code % : %.o $(LCUS) echo !!! Custom build !!! $(MY_CMD) $< -o $@ $(LCUS)
over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

Tomado del manual de make en línea de GNU :

Puede anular una regla implícita integrada (o una que haya definido usted mismo) definiendo una nueva regla de patrón con el mismo destino y requisitos previos, pero con diferentes comandos.

Asumiría que es porque los requisitos previos no son los mismos que la regla implícita.

También tome del manual de make :

La vinculación de un solo archivo de objeto n se realiza automáticamente desde no ejecutando el vinculador (generalmente llamado ld ) a través del compilador C. El comando preciso utilizado es $(CC) $(LDFLAGS) no $(LOADLIBES) $(LDLIBS) . Esta regla hace lo correcto para un programa simple con solo un archivo fuente. También hará lo correcto si hay varios archivos de objetos (presumiblemente provenientes de varios otros archivos fuente), uno de los cuales tiene un nombre que coincide con el del archivo ejecutable. Por lo tanto,

 x: yo zo

cuando xc , yc y zc existan, se ejecutará:

 cc -c xc -o xo cc -c yc -o yo cc -c zc -o zo cc xo yo zo -ox rm -f xo rm -f yo rm -f zo

Básicamente, make entiende las reglas implícitas para los archivos de programa que se generan a partir de archivos .o , pero cuando agrega su biblioteca estática, no las entiende. Una forma sencilla de probar sería eliminar $(LCUS) de sus dependencias (como medida temporal) para ver si luego usa su regla en lugar de la integrada. Si es así, entonces sabes que ese es tu problema. Si simplemente agregar myapp en reemplazo de % es un problema porque desea que la regla genere varios objetivos, puede intentar lo siguiente:

 $(APPS): % : %.o $(LCUS)

donde $(APPS) es una variable que contiene todas las aplicaciones que desea crear. Esto permitirá que una regla cree varios objetivos. También puede omitir el uso de la variable por completo y colocar una lista separada por espacios. Este es un ejemplo de una regla de patrón estático, puede encontrar más información aquí . La diferencia entre el patrón estático y las reglas implícitas se puede encontrar aquí.

over 4 years ago · Santiago Trujillo Relatório

0

Su regla no es la misma que la regla implícita incorporada, por lo que no la cancela.

Además, make siempre prefiere una regla que no requiera la creación de archivos intermedios a una que sí lo haga. Si crea previamente el archivo .a , make podría usar su regla en su lugar (pero es posible que ni siquiera lo haga).

Si cancela la regla incorporada y deja su regla en su lugar, creo que debería funcionar correctamente.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda