O GCC é a sigla para GNU Compiler Collections e trata-se de um compilador usado em linguagens como C/C++. O trabalho principal de um compilador é transformar um código-fonte em um código binário executável a nível de linguagem de máquina. E é com ele também que se faz a associação com bibliotecas externas (linkagem), geração de códigos para debugging e também arquivos objeto.
Neste resumido artigo será mostrado algum dos comandos mais básicos do GCC (foco em C++, logo o comando usado é o g++) para geração de arquivos usados na criação de um executável. A principal fonte e também leitura recomendada é o manual do programa que pode ser acessado pelo comando man gcc, ou de forma resumida com gcc --help.
Uso básico do GCC
Ao passar um arquivo para o compilador, as etapas a serem executadas são as seguintes:
- Preprocessamento
- Compilação e assembly
- Linkagem
É possível parar o processo em uma dessa etapas caso se queira e assim gerar arquivos intermediários.
Parar após preprocessamento
Nesta etapa, ocorre, por exemplo, a inclusão dos arquivos de cabeçalho indicados com a diretiva #include e também a substituição das macros (#define), além da inclusão de códigos que passam pelos blocos condicionais (#if, #ifdef, #ifndef, etc) entre outra operaçôes.
O resultado é um arquivo ainda com cara de C++ porém com dezenas de milhares ou mais de linhas de código pois inclui as definições de todos os arquivos externos (arquivos *.h). Convencionalmente, a extensão desse arquivo é .ii.
Para gerar o arquivo pós-preprocessamento usa-se a opção -E (é preciso indicar um arquivo de saída, ou então será usado o console).
g++ -E arquivo.cpp -o arquivo.ii
Parar após a compilação
No processo de compilação, o código fonte é transformado em código assembly (extensão .s) porém, ainda em formato texto (pode ser visualizado num editor comum).
Para se obter esse arquivo passa-se a opção -S. O arquivo de entrada pode ser tanto um .cpp quanto um .ii.
g++ -S arquivo.ii -o arquivo.s
Parar após o assembler
Após a compilação, é gerado um código em assembly mas no formato texto, no entanto, o executável precisa estar no formato binário e para isso é preciso passar pelo etapa do assembler que vai gerar um arquivo binário, porém ainda não executável.
No ambiente Linux, esse arquivo é chamado de arquivo objeto e tem extensão (.o), ele contém os símbolos (assunto para outro post) do programa já no formato binário.
Para se chegar nesse arquivo pode se passar qualquer formato anterior com a opção -c. Essa opção também é conhecida como "compilar sem linkar", pois é a única etapa pendente para se chegar no executável final.
g++ -c arquivo.s -o arquivo.o
Adicionar informações para debugging
O debugger do GCC/++ é o gdb e para ser usado precisa que o executável contenha informações adicionais no executável final. Para incluir essas informações passa-se a opção -g.
g++ -cg arquivo.cpp -o arquivod.o
Linkagem
Caso se queira compilar e linkar com as bibliotecas, não é necessário passar a opção -c. Entende-se que o compilador irá passar por todas as etapas, incluindo a última que é a linkagem com os dependências externas.
Uma vez compilados os arquivos .cpp e gerados arquivos .o, para se obter o binário executável é necessário passar pelo processo de linkagem.
Para isso passam-se os arquivos compilados .o e a lista de bibliotecas com a opção -l e nome da lib, sem o prefixo lib (por exemplo, -lGL para linkar com a libGL). Caso seja necessário linkar com uma lib dinâmica (.so) que não esteja no sistema, pode-se passar o endereço dessa lib com a opção -L. Para linkar com uma lib estática (.a), passa-se o arquivo junto dos demais arquivos compilados .o.
É importante indicar o arquivo binário final com a opção de output -o.
g++ arquivo.o -lGL another_lib.a -o program
Conclusão
Aqui foram mostradas, por alto, alguns dos comandos mais básicos na geração de arquivos do GCC na hora de compilar e gerar o programa,. Há mais opções úteis quando se tem uma ferramenta tão poderosa assim que pretendo trazer em outro post, como otimizações para gerar programas mais eficientes (porém com compilação mais lenta) e até indicação de qual standard usar (c++11, c++14, etc.).
Top comments (0)