Como funciona o processo de compilação e linking em C++?
Olá a todos! Comecei a estudar C++ não faz muito tempo, e fiquei confuso sobre o que acontece depois que clico no botão "Build" ou executo g++ no terminal.
Escrevi um programa simples com dois arquivos: `main.cpp` e `utils.cpp`. Em `utils.cpp`, tenho uma função `void sayHello()`, que imprime "Hello!" no console. Em `main.cpp`, declaro essa função como externa (`extern void sayHello();`) e a chamo.
Quando compilo isso com o comando `g++ main.cpp utils.cpp -o program`, tudo funciona. Mas não entendo o que exatamente o compilador faz e o que o linker faz. Por que, se eu cometer um erro de digitação na declaração da função (por exemplo, escrever `sayHelllo`), recebo um erro na etapa de linking, e não na compilação? E de onde vêm os arquivos .o que às vezes aparecem na pasta do projeto?
O que me confunde especialmente é que em algumas IDEs vejo etapas separadas: "Compiling main.cpp...", "Compiling utils.cpp...", e depois "Linking...". Por que são necessárias tantas etapas? Por que não pode ser tudo feito de uma vez? Ficarei grato