<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Vinicius Almada</title>
    <description>The latest articles on DEV Community by Vinicius Almada (@viniciusalmada).</description>
    <link>https://dev.to/viniciusalmada</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F398808%2F7ad72e4e-4170-4f38-9169-3ab577a6a1c4.jpeg</url>
      <title>DEV Community: Vinicius Almada</title>
      <link>https://dev.to/viniciusalmada</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/viniciusalmada"/>
    <language>en</language>
    <item>
      <title>Compilação e linkagem com GCC/G++</title>
      <dc:creator>Vinicius Almada</dc:creator>
      <pubDate>Wed, 12 Jan 2022 12:58:52 +0000</pubDate>
      <link>https://dev.to/viniciusalmada/compilacao-e-linkagem-com-gccg-46g3</link>
      <guid>https://dev.to/viniciusalmada/compilacao-e-linkagem-com-gccg-46g3</guid>
      <description>&lt;p&gt;O GCC é a sigla para &lt;strong&gt;GNU Compiler Collections&lt;/strong&gt; 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.&lt;/p&gt;

&lt;p&gt;Neste resumido artigo será mostrado algum dos comandos mais básicos do GCC (foco em C++, logo o comando usado é o &lt;code&gt;g++&lt;/code&gt;) 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 &lt;code&gt;man gcc&lt;/code&gt;, ou de forma resumida com &lt;code&gt;gcc --help&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Uso básico do GCC
&lt;/h3&gt;

&lt;p&gt;Ao passar um arquivo para o compilador, as etapas a serem executadas são as seguintes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Preprocessamento&lt;/li&gt;
&lt;li&gt;Compilação e assembly&lt;/li&gt;
&lt;li&gt;Linkagem&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;É possível parar o processo em uma dessa etapas caso se queira e assim gerar arquivos intermediários.&lt;/p&gt;

&lt;h3&gt;
  
  
  Parar após preprocessamento
&lt;/h3&gt;

&lt;p&gt;Nesta etapa, ocorre, por exemplo, a inclusão dos arquivos de cabeçalho indicados com a diretiva &lt;code&gt;#include&lt;/code&gt; e também a substituição das macros (&lt;code&gt;#define&lt;/code&gt;), além da inclusão de códigos que passam pelos blocos condicionais (&lt;code&gt;#if&lt;/code&gt;, &lt;code&gt;#ifdef&lt;/code&gt;, &lt;code&gt;#ifndef&lt;/code&gt;, etc) entre outra operaçôes. &lt;/p&gt;

&lt;p&gt;O resultado é um arquivo ainda com cara de &lt;code&gt;C++&lt;/code&gt; porém com dezenas de milhares ou mais de linhas de código pois inclui as definições de todos os arquivos externos (arquivos &lt;code&gt;*.h&lt;/code&gt;). Convencionalmente, a extensão desse arquivo é &lt;code&gt;.ii&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Para gerar o arquivo pós-preprocessamento usa-se a opção &lt;code&gt;-E&lt;/code&gt; (é preciso indicar um arquivo de saída, ou então será usado o console).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;g++ &lt;span class="nt"&gt;-E&lt;/span&gt; arquivo.cpp &lt;span class="nt"&gt;-o&lt;/span&gt; arquivo.ii
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Parar após a compilação
&lt;/h3&gt;

&lt;p&gt;No processo de compilação, o código fonte é transformado em código assembly (extensão &lt;code&gt;.s&lt;/code&gt;) porém, ainda em formato texto (pode ser visualizado num editor comum). &lt;/p&gt;

&lt;p&gt;Para se obter esse arquivo passa-se a opção &lt;code&gt;-S&lt;/code&gt;. O arquivo de entrada pode ser tanto um &lt;code&gt;.cpp&lt;/code&gt; quanto um &lt;code&gt;.ii&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;g++ &lt;span class="nt"&gt;-S&lt;/span&gt; arquivo.ii &lt;span class="nt"&gt;-o&lt;/span&gt; arquivo.s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Parar após o assembler
&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;No ambiente Linux, esse arquivo é chamado de arquivo objeto e tem extensão (&lt;code&gt;.o&lt;/code&gt;), ele contém os símbolos (assunto para outro post) do programa já no formato binário.&lt;/p&gt;

&lt;p&gt;Para se chegar nesse arquivo pode se passar qualquer formato anterior com a opção &lt;code&gt;-c&lt;/code&gt;. Essa opção também é conhecida como "compilar sem linkar", pois é a única etapa pendente para se chegar no executável final.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;g++ &lt;span class="nt"&gt;-c&lt;/span&gt; arquivo.s &lt;span class="nt"&gt;-o&lt;/span&gt; arquivo.o
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Adicionar informações para debugging
&lt;/h3&gt;

&lt;p&gt;O debugger do GCC/++ é o &lt;strong&gt;gdb&lt;/strong&gt; 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 &lt;code&gt;-g&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;g++ &lt;span class="nt"&gt;-cg&lt;/span&gt; arquivo.cpp &lt;span class="nt"&gt;-o&lt;/span&gt; arquivod.o
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Linkagem
&lt;/h3&gt;

&lt;p&gt;Caso se queira compilar e linkar com as bibliotecas, não é necessário passar a opção &lt;code&gt;-c&lt;/code&gt;. Entende-se que o compilador irá passar por todas as etapas, incluindo a última que é a linkagem com os dependências externas.&lt;/p&gt;

&lt;p&gt;Uma vez compilados os arquivos &lt;code&gt;.cpp&lt;/code&gt; e gerados arquivos &lt;code&gt;.o&lt;/code&gt;, para se obter o binário executável é necessário passar pelo processo de linkagem.&lt;/p&gt;

&lt;p&gt;Para isso passam-se os arquivos compilados &lt;code&gt;.o&lt;/code&gt; e a lista de bibliotecas com a opção &lt;code&gt;-l&lt;/code&gt; e nome da lib, sem o prefixo &lt;code&gt;lib&lt;/code&gt; (por exemplo, &lt;code&gt;-lGL&lt;/code&gt; para linkar com a &lt;code&gt;libGL&lt;/code&gt;). Caso seja necessário linkar com uma lib dinâmica (&lt;code&gt;.so&lt;/code&gt;) que não esteja no sistema, pode-se passar o endereço dessa lib com a opção &lt;code&gt;-L&lt;/code&gt;. Para linkar com uma lib estática (&lt;code&gt;.a&lt;/code&gt;), passa-se o arquivo junto dos demais arquivos compilados &lt;code&gt;.o&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;É importante indicar o arquivo binário final com a opção de output &lt;code&gt;-o&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;g++ arquivo.o &lt;span class="nt"&gt;-lGL&lt;/span&gt; another_lib.a &lt;span class="nt"&gt;-o&lt;/span&gt; program
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Conclusão
&lt;/h3&gt;

&lt;p&gt;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.).&lt;/p&gt;

</description>
      <category>cpp</category>
      <category>gcc</category>
      <category>linux</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
