AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / ubuntu / Perguntas / 1541195
Accepted
KeShAw
KeShAw
Asked: 2025-02-12 05:38:31 +0800 CST2025-02-12 05:38:31 +0800 CST 2025-02-12 05:38:31 +0800 CST

Diferença entre excluir e tocar em um arquivo em relação ao comando `make`

  • 772
blah: blah.o
    cc blah.o -o blah # Runs third

blah.o: blah.c
    cc -c blah.c -o blah.o # Runs second

blah.c:
    echo "int main() { return 0; }" > blah.c # Runs first

Quando eu executo makeo comando, ele dá a saída esperada. Agora, se eu toucho arquivo blah.c, a saída é cc -c blah.c -o blah.o cc blah.o -o blah, mas quando eu executo o deletearquivo blah.c, ele continua a criá-lo e a saída é echo "int main() {return 0; }" > blah.c cc -c blah.c -o blah.o cc blah.o -o blah.

Agora o que não consigo entender é como o 'blah' soube que blah.c não está disponível. Ele apenas verificou blah.o cujo carimbo de data/hora não mudou. É que o próprio blah.o verifica blah.c para qualquer atualização quando foi verificado por 'blah'. De qualquer forma, por que as duas saídas são diferentes? É que touching o arquivo blah.c não o removeu, e blah.o está ciente disso, então ele apenas atualizou seu carimbo de data/hora. O que está realmente acontecendo?

make
  • 2 2 respostas
  • 53 Views

2 respostas

  • Voted
  1. Best Answer
    Paul_Pedant
    2025-02-14T17:36:35+08:002025-02-14T17:36:35+08:00

    Ok: para responder à sua pergunta real sobre excluir ou alterar um arquivo:

    Quando você cria touchum arquivo (ou o atualiza editando, baixando uma fonte de um repositório, aplicando patches, etc.), ele se torna mais novo que qualquer outro arquivo. A execução makeexecutará os comandos que são afetados por essa situação e garantirá que cada dependência seja avaliada na ordem determinada pela árvore de dependências.

    Quando você deleteum arquivo, ele é tratado como sendo infinitamente antigo (ou possivelmente 01-Jan-1970 00:00:00). A execução makeexecutará quaisquer regras que sejam afetadas por essa situação diferente.

    makeconsertará tudo o que o Makefile escolher. Por exemplo, se você alterar um .harquivo que é mencionado em sete dos seus dezoito .carquivos (e as regras apropriadas estiverem corretas), então makeexecutará as compilações para esses sete .carquivos, e também as regras onde qualquer coisa depende dos .oarquivos deles.

    • 2
  2. user10489
    2025-02-12T08:14:46+08:002025-02-12T08:14:46+08:00

    Sua linha de dependência for blah.cnão lista nenhuma dependência, então make não tem um arquivo para comparar para decidir reconstruí-lo. Então ele só o reconstruirá se ele não existir.

    Como tudo para criar blah.c está no próprio makefile, eu sugeriria tornar o makfile uma dependência.

    blah.c: Makefile
    

    E então toda vez que você editar (ou mexer) no Makefile, ele reconstruirá o blah.c.

    Para maior sofisticação, em vez de escrever diretamente em blah.c, escreva em blah.c.new e, se forem diferentes, substitua blah.c e, se forem iguais, exclua blah.c.new.

    • 0

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Existe um comando para listar todos os usuários? Também para adicionar, excluir, modificar usuários, no terminal?

    • 9 respostas
  • Marko Smith

    Como excluir um diretório não vazio no Terminal?

    • 4 respostas
  • Marko Smith

    Como descompactar um arquivo zip do Terminal?

    • 9 respostas
  • Marko Smith

    Como instalo um arquivo .deb por meio da linha de comando?

    • 11 respostas
  • Marko Smith

    Como instalo um arquivo .tar.gz (ou .tar.bz2)?

    • 14 respostas
  • Marko Smith

    Como listar todos os pacotes instalados

    • 24 respostas
  • Martin Hope
    Flimm Como posso usar o docker sem sudo? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    led-Zepp Como faço para salvar a saída do terminal em um arquivo? 2014-02-15 11:49:07 +0800 CST
  • Martin Hope
    ubuntu-nerd Como descompactar um arquivo zip do Terminal? 2011-12-11 20:37:54 +0800 CST
  • Martin Hope
    TheXed Como instalo um arquivo .deb por meio da linha de comando? 2011-05-07 09:40:28 +0800 CST
  • Martin Hope
    Ivan Como listar todos os pacotes instalados 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    David Barry Como determino o tamanho total de um diretório (pasta) na linha de comando? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher "Os seguintes pacotes foram retidos:" Por que e como resolvo isso? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford Como os PPAs podem ser removidos? 2010-07-30 01:09:42 +0800 CST

Hot tag

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve