erro na compilação [RESOLVIDO]

1. erro na compilação [RESOLVIDO]

Gabriel Duarte
birdblack

(usa Ubuntu)

Enviado em 07/03/2019 - 17:47h

Preciso compilar e executar o meu programa em C++ através do Ubuntu. Ao executar o seguinte comando :
$ g++ -std=c++11 -lm -o programa.cpp
é me retornado o seguinte :
/usr/lib/gcc/i686-linux-gnu/5/../../../i386-linux-gnu/crt1.o: In fuction `_start:
(.texy+0x18): undefined reference to `main'
collect2: error: ld returned 1 exit status

Além disso, o arquivo fonte(.cpp) é apagado do diretório onde está localizado. Alguém já viu algo parecido e sabe como resolver?


  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 07/03/2019 - 19:50h

Quando você usa a opção -o, você diz para o compilador que o próximo argumento será o nome do arquivo a ser produzido pela compilação. Como o argumento seguinte traz o provável nome do arquivo fonte, você acaba mandando ele ser sobrescrito.

Provavelmente você deveria usar algo como o seguinte.
g++ -std=c++11 -Wall -Werror -pedantic-errors -O2 programa.cpp -o programa 


Isso produzirá o arquivo de saída “programa” (ou “programa.exe”, se for no Windows) a partir do código fonte contido em “programa.cpp”.


... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)

3. RE:2

Gabriel Duarte
birdblack

(usa Ubuntu)

Enviado em 07/03/2019 - 21:38h

paulo1205 escreveu:

Quando você usa a opção -o, você diz para o compilador que o próximo argumento será o nome do arquivo a ser produzido pela compilação. Como o argumento seguinte traz o provável nome do arquivo fonte, você acaba mandando ele ser sobrescrito.

Provavelmente você deveria usar algo como o seguinte.
g++ -std=c++11 -Wall -Werror -pedantic-errors -O2 programa.cpp -o programa 


Isso produzirá o arquivo de saída “programa” (ou “programa.exe”, se for no Windows) a partir do código fonte contido em “programa.cpp”.


... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)



Obrigado, paulo1205!

Seguindo esse comando, o terminal me retorna:

programa.cpp: In function ‘int main()’:
programa.cpp:51:20: error: ignoring return value of ‘int system(const char*)’, declared with attribute warn_unused_result [-Werror=unused-result]
system("pause");
^
cc1plus: all warnings being treated as errors


Então, através da sua observação executei o seguinte comando, o qual funcionou perfeitamente:
g++ -std=C++11 -lm -o programa programa.cpp

We are all made of star dust


4. Re: erro na compilação [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 08/03/2019 - 11:27h

As opções de compilação que eu lhe mostrei aumentam o nível de diagnóstico de código.

  • -Wall instrui o compilador a mostrar a maior quantidade possível de alertas sobre código que pode ter comportamento perigoso. Isso inclui casos de situações que são sintaticamente válidas, mas potencialmente perigosas ou inócuas (por exemplo: certas comparações entre inteiros com sinal e inteiros sem sinal, atribuições de valores a variáveis que possam provocar truncamento, alguns usos de operadores em contextos pouco usuais, entre outros). Mas pode incluir também verificações sobre atributos de variáveis e funções, deliberadamente aplicados sobre elas no momento de suas declarações.

    Alguns sistemas (particularmente aqueles derivados do Debian) aplicam atributos a funções da biblioteca padrão com vistas à segurança de código, particularmente no caso de funções cuja execução com erro pode impactar o restante da execução do programa, e mais especialmente ainda quando tais funções sinalizam esses eventuais erros ao programador, de modo que ele teria condições de evitar ou mitigar efeitos desses possíveis erros, se tão-somente tratar a sinalização que lhe foi dada. A função system() é uma dessas funções, cujo valor de retorno indica com que grau de sucesso ou falha o comando solicitado pode ter executado, e por isso ela é marcada com um atributo de produzir alertas caso o valor de retorno seja desprezado. Outros exemplos de funções com tal atributo são scanf(), fgets() e malloc(), entre outras.

    -Wall, por si só, apenas emite alertas, sem impedir o progresso da compilação, porém...

  • -Werror faz com que o compilador trate todos os alertas com o mesmo grau de gravidade de erros, impedindo, portanto, o progresso da compilação. Eu gosto dessa opção para me obrigar a tomar ciência de código que pode ser perigoso e me educar a programar de um modo mais seguro.

  • -pedantic-errors eleva ainda mais o rigor na análise de comportamento que poderia produzir alertas, atentando para aspectos de conformidade do código com certas regras prescritas nos padrões das linguagens de programação C ou C++, a um nível que algumas pessoas poderiam considerar pedantismo (por isso o nome da opção), e ainda faz com que tais alertas sejam convertidos em erros, impedindo o progresso da compilação.

Creio que tais opções têm um caráter realmente educador, na medida em que obrigam o programador a não se contentar com o menor esforço, que permite que um programa funcione apenas se nada de errado acontecer. Isso pode parecer bobagem no caso de um pequeno programa de testes, mas muitos dos hábitos que nós adquirimos em nossas vidas de programadores vêm da época do nosso aprendizado e dos programinhas de testes do nosso dia-a-dia (os quais, em última análise, são também parte do nosso processo de aprendizado continuado). Um dia, a alocação de memória que quase nunca falha vai eventualmente falhar, o arquivo que sempre esteve presente abre não vai abrir por não ter sido encontrado ou não vai poder ser criado porque o disco está cheio ou porque a conexão de rede caiu, o fim do arquivo vai chegar numa hora inesperada e produzir uma entrada que vai gerar dados inválidos, que não podem ser tratados como se válidos fossem.

A mudança de paradigma pode parecer um pouco penosa a princípio, pois é inegável que gerar código que intercepte e teste a possibilidade de erro dá mais trabalho do que executar tudo às cegas, mas depois de um tempo a gente se habitua e o novo estilo de programar flui muito mais naturalmente.


... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts