14
respostas

[Dúvida] Problema na compilação do projeto

Boa Noite, após eu terminar o projeto tudo estava funcionando corretamente, mas quando religuei o computador ao tentar rodar o jogo-forca.cpp ele dá erro de compilação

C:\Users\Pichau\AppData\Local\Temp\ccWS71OR.o:jogo-forca.cpp:(.text+0x17): undefined reference to sorteioPalavra()' C:\Users\Pichau\AppData\Local\Temp\ccWS71OR.o:jogo-forca.cpp:(.text+0x27): undefined reference to ler_arquivoabi:cxx11' C:\Users\Pichau\AppData\Local\Temp\ccWS71OR.o:jogo-forca.cpp:(.text+0x36): undefined reference to nao_acertou()' C:\Users\Pichau\AppData\Local\Temp\ccWS71OR.o:jogo-forca.cpp:(.text+0x3f): undefined reference to nao_enforcou()' C:\Users\Pichau\AppData\Local\Temp\ccWS71OR.o:jogo-forca.cpp:(.text+0x58): undefined reference to imprime_erros()' C:\Users\Pichau\AppData\Local\Temp\ccWS71OR.o:jogo-forca.cpp:(.text+0x5d): undefined reference to imprime_palavra()' C:\Users\Pichau\AppData\Local\Temp\ccWS71OR.o:jogo-forca.cpp:(.text+0x97): undefined reference to verificacao_chute()' C:\Users\Pichau\AppData\Local\Temp\ccWS71OR.o:jogo-forca.cpp:(.text+0xf8): undefined reference to nao_acertou()' C:\Users\Pichau\AppData\Local\Temp\ccWS71OR.o:jogo-forca.cpp:(.text+0x195): undefined reference to `adiciona_palavra()'

Acredito que seja o problema de LINKAGEM, mas não estou conseguindo resolver, não consigo compilar o projeto de novo, alguém poderia me ajudar?? Não mexi em nada nos arquivos .cpp nem .hpp. Eu literalmente religuei o PC e não funciona mais, acredito que seja porque preciso compilar todos os arquivos e não só o jogo-forca, mas não sei como fazer isso...

14 respostas

Olá Lucas! Poderia me enviar o código fonte para que eu possa analisar?

Se há mais de um arquivo, provavelmente esse erro está relacionado a inclusão de cabeçalho duplicado ou falta do mesmo.

Assim que vc enviar eu faço a análise junto a vc do possível problema.

Fico no aguardo, bons estudos.

#include

#include

#include

#include "imprime_cabecalho.hpp"

#include "nao_acertou.hpp"

#include "letra_existe.hpp"

#include "nao_enforcou.hpp"

#include "imprime_erros.hpp"

#include "imprime_palavra.hpp"

#include "ler_arquivo.hpp"

#include "sorteio_palavra.hpp"

#include "adiciona_palavra.hpp"

#include "verificacao_chute.hpp"

using namespace std;

string palavra_secreta;

map <char, bool> chutou;

vector chutes_errados;

int main(){

sorteioPalavra();

imprime_cabecalho();
ler_arquivo();

while(nao_acertou() and nao_enforcou()){
    
    imprime_erros();
    imprime_palavra();

    cout<<endl<<endl<<"Seu chute: ";
    
    verificacao_chute();
}

cout<<"Fim de jogo!"<<endl;
cout<<"Palavra Secreta: "<<palavra_secreta<<endl;
if(nao_acertou()){
    cout<< "Voce Perdeu! Tente Novamente!"<<endl;
}
else{
    cout<<"Voce Ganhou! Parabens!"<<endl;
    cout << "Você deseja adicionar uma nova palavra ao banco? (S/N)" << endl;
    char resposta;
    cin >> resposta;
    if(resposta == 'S' or resposta == 's'){
        adiciona_palavra();
    }
}
return 0;

}`

obs: os 3 primeiros includes são o vector, map e iostream

Olá!

Teria como me mandar o codigo completo? junto aos arquivos de de cabeçalho ( .hpp ) e os arquivos ".cpp".

Eu preciso depurar eles para encontrar o problema de compilação.

Vc tem "git hub" ? caso tenha, pode commitar o código lá e me passar o link, ou pode enviar por aqui mesmo.

Vou deixar uma dica:

caso vc escreva algo no forúm da Alura entre 3 crases o codigo fica disponível para cópia. exemplo:

g++ main.cpp

coloquei 3 crases acima e 3 abaixo.

Assim vc consegue organizar melhor.

https://github.com/gustavocosta9/jogo-da-forca-cpp

Aqui está, se puder me auxiliar nesse problema seria de grande ajuda!

Olá!

No seu código vc inclui alguns arquivos de cabeçalhos (.hpp) inexistentes, por exemplo:

  • em adiciona_palavra.cpp

#include "salva_arquivo.hpp" //não existe esse arquivo no código que vc enviou no GitHub

  • em jogo_forca.cpp

#include "sorteio_palavra.hpp" e #include "verificacao_chute.hpp" //tbm não existem no github

  • tbm há funções com esses nomes, mas que não foram definidos em nenhum lugar do codigo

deixando essas linhas de código como comentário o programa já consegue compilar (com o comando (g++ *.cpp) no diretorio do fonte.

  • outros detahes:

Ele não tem uma funcionalidade perfeita após compilado (talvez vc esqueceu de subir esses arquivos para o repositório ou esqueceu de criar-los), mas se vc quiser eu posso te ajudar a finalizar ele, ou vc prefere fazer sozinho para praticar?

eu descobri os arquivos com problemas de compilação compilando cada arquivo individualmente com:

g++  -c  nome_do_arquivo.cpp

e usei o seguinte comando no terminal do linux para saber se havia alguma definição para a função:

cat  *  | grep  nome_da_funcao

usei esse comando para cada função "suspeita", dentro do diretório do projeto.

Veja se vc enviou todos os arquivos ou ficou faltando algum.

Bom Dia,

o salva_arquivo.hpp não está no jogo-forca.cpp porque não é utilizado diretamente pelo jogo-forca.cpp. O #include salva_arquivo.hpp só está presente nas funções onde é necessário a sua utilização, por isso não o inclui no jogo-forca.cpp.

Além disso, os outros arquivo por algum motivo não subiram para o GitHub, mas agora já estão disponiveis, vou mandar o link novamente! desde já, agradeço toda a atenção e suporte que você vem dando.

https://github.com/gustavocosta9/jogo-da-forca-cpp

Olá!

Eu fiz o git clone do seu repositório para minha máquina com os novos arquivos e o código compilou normalmente, sem nenhum erro, mesmo eu não tendo feito nenhuma alteração.

Tente compilar novamente os arquivos e caso não tenha resultado, tente compilar novamente sem o "Cmake", execultando o comando:

g++  -std=c++11  *.cpp -o jogo.exe

isso vai compilar todos os arquivos ".cpp" existentes no diretório atual, então fique no diretório apenas com os arquivos que vc subiu no GitHub (o diretório deve conter os arquivos ".hpp" tbm, pois os ".cpp" dependem dos arquivos de cabeçalhos para conseguirem compilar com sucesso!).

Caso mesmo assim fique gerando esses erros de referêcia, coloque a diretiva de pré-processamento no INICIO de CADA arquivo ".hpp":

#pragma once

isso vai evitar dupla inclusão de cabeçalhos. (o mesmo cabeçalho é incluido pelo arquivo da Main() e pelo arquivo da definição das funções, isso as vezes pode gerar erro).

Tente essas abordagens, mesmo no meu tendo compilado sem nehum erro, cada IDE atua de uma forma diferênte.

E não esqueça de salvar o arquivo antes de compilar, algumas IDEs não salvam o arquivo altomaticamete.

Fico no aguardo do resultado. Bons estudos!

Vc tbm consegue compilar esses arquivos pelo própio GitHub, indo nos 3 traços no canto superir esquerdo e dps em "codespaces", lá vc pode criar um codespace em nuvem somente com repositório selecionado.

lá vc pode abrir o terminal e executar qualquer um dos comandos citados anteriormente.

Eu uso o visual studio code, fiz tudo oque você recomendou, utilizei o pragma once, sinceramente é desanimador porque o erro de undefined persiste no terminal e na sua máquina executou normalmente... Consegui até criar um arquivo executável mas ele também já não faz todas as funcionalidades de antes durante a execução do programa, termina de forma inesperada durante o jogo da forca.

C:\Users\Pichau\AppData\Local\Temp\ccDAUU1x.o:jogo-forca.cpp:(.text+0x17): undefined reference to `sorteioPalavra()'
C:\Users\Pichau\AppData\Local\Temp\ccDAUU1x.o:jogo-forca.cpp:(.text+0x27): undefined reference to `ler_arquivo[abi:cxx11]()'
C:\Users\Pichau\AppData\Local\Temp\ccDAUU1x.o:jogo-forca.cpp:(.text+0x36): undefined reference to `nao_acertou()'
C:\Users\Pichau\AppData\Local\Temp\ccDAUU1x.o:jogo-forca.cpp:(.text+0x3f): undefined reference to `nao_enforcou()'
C:\Users\Pichau\AppData\Local\Temp\ccDAUU1x.o:jogo-forca.cpp:(.text+0x58): undefined reference to `imprime_erros()'
C:\Users\Pichau\AppData\Local\Temp\ccDAUU1x.o:jogo-forca.cpp:(.text+0x5d): undefined reference to `imprime_palavra()'
C:\Users\Pichau\AppData\Local\Temp\ccDAUU1x.o:jogo-forca.cpp:(.text+0x97): undefined reference to `verificacao_chute()'
C:\Users\Pichau\AppData\Local\Temp\ccDAUU1x.o:jogo-forca.cpp:(.text+0xf8): undefined reference to `nao_acertou()'
C:\Users\Pichau\AppData\Local\Temp\ccDAUU1x.o:jogo-forca.cpp:(.text+0x195): undefined reference to `adiciona_palavra()'

Isso aparece quando eu dou Run no jogo-forca.cpp, estou no diretório certo (C:\Users\Pichau\Documents\C++) e todos os arquivos estão no mesmo diretório. Ainda não consigo localizar o erro sendo que antes estava funcionando normalmente e eu não alterei nada.

Cara, vou usar uma outra alternativa para esse tipo de inclusão de cabeçalho.

retire a diretiva "pragma once" e faça o seguinte:

no inicio dos arquivos (.hpp) coloque :

#ifndef NOME_DO_ARQUIVO_HPP
#define NOME_DO_ARQUIVO_HPP

E no final do arquivo coloque:

#endif

o "NOME_DO_ARQUIVO_HPP" tem não pode conter pontos ( . ), use underline ( _ ) para separar as palavras. Coloque o esse nome referente ao arquivo, por exemplo, no arquivo sorteia_palavra.hpp coloque SORTEIA_PALAVRA_HPP.

o "ifndef" significa: "if not define" ou "se não estiver definido" ai ele executa o "define" e copia aquela parte do código do arquivo de cabeçalho (.hpp) para o programa. Se caso aquele nome já tenha sido definido, então aquele arquivo já foi definido em algum lugar do programa, daí o compilador ignora ele para não dar duplicidade. o "endif" finaliza o escopo.

NOTE: Coloque ifndef (com "n") e não ifdef (sem "n"), pois na segunda opção ele não vai incluir o arquivo de cabeçalho.

Geralmente eu programo usando essa diretiva e usando a extensão hh (.hh), pois eu acho mais formal, mas hpp tbm da certo.

No meu caso eu compilei e executei pelo terminal do Linux mesmo.

E eu uso a IDE do VsCode em nuvem do GitHub (o codespace).

Bom Dia, passei o domingo inteiro procurando por uma solução, vi inúmeros vídeos no youtube, vi no stackoverflow mas remetem a erros de declaração por exemplo, como se eu tivesse declarado 'int man()' ao invés de 'int main()'. Sei que não é recomendado, mas no include do jogo-forca.cpp eu alterei o .hpp pela extensão .cpp nos arquivos modularizados. Feito isso, o programa compilou normalmente. Não sei ainda oque pode ser feito diante disso, testei no meu notebook e até o projeto da Alura zipado estava dando esses erros de undefined sem eu ter alterado os arquivos dos instrutores.

Bom dia! Tente reinstalar o compilador ou a IDE que vc estiver utilizando.

normalmente esse erro ocorre quando o compilador não acha a função na qual vc está querendo chamar, a maioria das vezes isso ocorre quando os arquivos de cabeçalhos não são incluídos ou quando vc esquece de compilar algum arquivo ".cpp" junto ao arquivo da "main()", vamos aos exemplos:

há 3 arquivos ".cpp" (main.cpp, pessoa.cpp, conta.cpp) e 2 arquivos de cabeçalhos (conta.hh, pessoa.hh)

se vc esquecer de dar o "#include" em algum dos cabeçalhos no arquivo onde está a main (#include "conta.hh" e #include "pessoa.hh") gera o erro de referência.

se vc esquecer de compilar os arquivos de definição juntos, também gera o erro, tipo se vc executar o comando:

g++ main.cpp -o programa.exe //NESSA SITUAÇÃO EM ESPECÍFICO, isto está errado, pois os outros 2 arquivos (com as definições das funções) não estão sendo compilados

isso gera erro, pois mesmo adicionando os arquivos de cabeçalho no arquivo da main, o código não reconhece a implementação das funções, pois eles não foram compilados juntos. a solução para um código com vários arquivos conseguir compilar, é a de incluir todos os arquivos ".cpp" em um único comando:

g++ main.cpp pessoa.cpp conta.cpp -o programa.exe // aqui vc compila o arquivo da main e TODAS as definições de funções

ou também compilando cada um separadamente, gerando os arquivos ".o" e dps juntando td, que gera o mesmo resultado do anterior:

g++ -c main.cpp //cria main.o
g++ -c pessoa.cpp //cria pessoa.o
g++ -c conta.cpp //cria conta.o
g++ conta.o pessoa.o main.o -o programa.exe

Como no seu caso, que vc já está fazendo tudo certo e não está obtendo resultado, recomendo que reinstale o compilador e a IDE, para tentar corrigir o atual problema.

Estou torcendo por vc! Estou aqui para oq precisar, e como sempre, estou no aguardo. Bons estudos!