Pular para o conteúdo

Compilando programas em C++

Neste capítulo, vamos aprender a compilar e executar programas com um único arquivo e projetos em C++.

No terminal, abra a pasta c_cpp_projects que criamos anteriormente para guardar nossos projetos.

Terminal window
cd ~/dev/c_cpp_projects

Programa

Crie um diretório chamado binary_tree, entre nele e abra-o no Visual Studio Code.

Terminal window
mkdir binary_tree
cd binary_tree
code .

Lembre-se de ativar o perfil C/C++ que criamos no capítulo Configurando o VSCode.

Crie um arquivo chamado main.cpp e adicione o seguinte código:

#include <iostream>
using namespace std;
int main()
{
cout << "Hello, World!" << endl;
return 0;
}

Para compilar o código, utilizamos o comando clang++, em vez de apenas clang. A estrutura do comando é a mesma.

Terminal window
clang++ main.cpp -o binary_tree

Para executar o programa, basta chamar o arquivo binário gerado:

Terminal window
./binary_tree
Terminal com os comandos para compilar e executar o programa "Binary Tree", cujo resultado é "Hello, World!"
Compilação e execução do programa "Binary Tree".

Projeto

Vamos editar este projeto para de fato representar uma árvore binária. Crie duas pastas dentro do projeto: tree e node.

Terminal window
mkdir tree node
  • Dentro de tree, crie um arquivo tree.cpp e um tree.hpp.
  • Dentro de node, crie um arquivo node.cpp e um node.hpp.
Terminal window
touch tree/tree.cpp tree/tree.hpp node/node.cpp node/node.hpp
  • Na raiz do projeto, crie os arquivos .clang-format e .clang-tidy.
Terminal window
touch .clang-format .clang-tidy
  • Use os snippets para preencher o conteúdo dos arquivos.

Acesse o projeto pelo repositório do livro. Nele, você encontrará a implementação de uma árvore binária e seus nós. Copie o conteúdo de todos os arquivos para os respectivos arquivos criados.

Compilação

Para compilar o projeto, precisamos passar todos os arquivos para o compilador. Fazemos isso usando o comando clang++ da seguinte maneira:

Terminal window
clang++ <arquivos.cpp> -I <pastas_com_arquivos.hpp> -o <executavel>
  • <arquivos.cpp>: todos os arquivos .cpp do projeto.
  • <pastas_com_arquivos.hpp>: todas as pastas que contêm arquivos .hpp do projeto.
  • <executavel>: nome do arquivo binário gerado.

Ou seja, precisamos especificar a localização de todos os arquivos que desejamos incluir e compilar. Dado que nosso projeto tem mais de uma pasta internamente, precisamos especificar a localização de todas elas. Execute o seguinte:

Terminal window
clang++ tree/tree.cpp node/node.cpp main.cpp -I tree -I node -o binary_tree

Para executar o programa, basta chamar o arquivo binário gerado:

Terminal window
./binary_tree

Se tudo estiver correto, você verá os nós da árvore binária sendo impressos no terminal em ordem crescente.

Terminal com os comandos para compilar e executar o projeto "binary_tree", cujo resultado é "1 3 4 5 7 8 9"
Compilação e execução do projeto "binary_tree".

Configurações

Assim como fizemos para projetos em C, podemos configurar tarefas de compilação para C++ no Visual Studio Code.

Se você seguiu os passos recomendados no capítulo Configurando o VSCode, já está configurada uma tarefa de compilação para C++.

Infelizmente, essa tarefa apenas compila arquivos .cpp que estejam na raiz do projeto. Uma vez que nosso projeto tem arquivos em pastas diferentes, precisamos especificar a localização de todos eles. Dessa forma, a tarefa de compilação global não é suficiente para compilar o projeto binary_tree. Precisamos criar um arquivo de tarefa personalizado para isso.

Nós configuramos também alguns snippets para facilitar a construção do arquivo tasks.json. Crie uma pasta chamada .vscode na raiz do projeto e um arquivo chamado tasks.json dentro dela.

Garanta que o perfil C/C++ esteja ativo e abra o arquivo tasks.json. Digite nele tasks-json e pressione Enter para preencher o arquivo com o snippet.

Visual Studio Code com o arquivo "tasks.json" aberto, sugerindo o preenchimento com o snippet para construção de tarefas.
Construção do arquivo "tasks.json".

Então, dentro do vetor tasks, digite cpp-build-task e pressione Enter para preencher o arquivo com o snippet.

Visual Studio Code com o arquivo "tasks.json" aberto, sugerindo o preenchimento com o snippet para a tarefa de compilação de C++.
Preenchimento da tarefa de compilação "cpp-build-task".

Observe o campo args. Ele contém os argumentos que passamos para o comando de compilação. Atualmente, ele recebe todos os arquivos .cpp que estejam na raiz do projeto.

"args": [
"-fcolor-diagnostics",
"-fansi-escape-codes",
"-g",
"${workspaceFolder}/*.cpp",
"-I",
"${workspaceFolder}",
"-o",
"${workspaceFolder}/${workspaceFolderBasename}"
],

Precisamos passar, além desses, todos os arquivos .cpp que estão nas pastas tree e node. Para isso, adicionamos uma linha para cada pasta, iniciando com o atalho ${workspaceFolder}, o qual indica a pasta raiz do projeto.

O arquivo tasks.json deve ficar da forma abaixo, assim como no repositório do livro.

{
"version": "2.0.0",
"tasks": [
{
"args": [
"-fcolor-diagnostics",
"-fansi-escape-codes",
"-g",
"${workspaceFolder}/*.cpp",
"${workspaceFolder}/node/*.cpp",
"${workspaceFolder}/tree/*.cpp",
"-I",
"${workspaceFolder}",
"-o",
"${workspaceFolder}/${workspaceFolderBasename}"
],
"command": "/usr/bin/clang++",
"detail": "Tarefa de compilação de um projeto em C++. Compila todos os arquivos C++ na raiz do projeto em um único executável.",
"group": {
"kind": "build"
},
"label": "Clang: build C++ project (all files in root) (Linux, Local)",
"options": {
"cwd": "${workspaceFolder}"
},
"problemMatcher": ["$gcc"],
"type": "cppbuild"
}
]
}

Poderemos então usar o atalho Ctrl + Shift + B para abrir o painel de tarefas de compilação. Então selecione a Clang: build C++ project (all files in root) (Linux, Local).

Visual Studio Code com o painel de tarefas aberto, mostrando a tarefa "Clang: build C++ project (all files in root) (Linux, Local)" selecionada.
Compilação do projeto "binary_tree" com a tarefa personalizada.

O Visual Studio Code compilará o projeto e mostrará o resultado no terminal integrado.

Terminal integrado do Visual Studio Code com a saída da compilação do projeto "binary_tree".
Saída da compilação do projeto "binary_tree".