“bash: Não existe tal arquivo ou diretório”, apesar de existir um arquivo [fechado]

0

Eu sou relativamente novo no Ubuntu e, recentemente, criei um arquivo .o digitando no terminal:

g++ -Wall -std=c++11 -c average.cpp -o average.o

No entanto, quando tentei executar o arquivo .o, recebi este erro:

bash: ./average: No such file or directory

embora eu tenha claramente o arquivo. Então eu decidi digitar file average.o , o que me deu isto: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped .

O problema é que ele deve ser um executável de 32 bits e, em caso afirmativo, como posso alterá-lo para um executável de 32 bits?

Editar: Então, eu posso criar average , mas quando eu tento executá-lo, eu recebo este erro:

terminate called after throwing an instance of 'std::logic_error'
  what():  basic_string::_M_construct null not valid
Aborted (core dumped)

Editar 2: Consegui corrigir o despejo principal e consegui dar permissão para que meu arquivo fosse executado, mas agora recebo um novo erro:

bash: ./average: cannot execute binary file: Exec format error .

Quando eu fiz file averge , recebi isso:

average: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped .

    
por Aaron Kang 06.03.2017 / 15:57

3 respostas

4

.o arquivos não são executáveis.

Tente um dos seguintes procedimentos:

  • Ignore a criação do arquivo .o e crie o executável

    g++ -Wall -std=c++11 average.cpp -o average
    ./average
    
  • Vincule o arquivo .o a um executável

    g++ -Wall -std=c++11 -c average.cpp -o average.o
    g++ -Wall -std=c++11 -o average average.o
    ./average
    

Se o arquivo average ainda não for executado, tente dar a ele permissões

chmod +x average

EDITAR (07/03/17)

Explicação

Pediram-me para explicar o que os comandos fazem, então aqui vai.

g ++

Este é o compilador que irá interpretar seu código e transformá-lo em código de máquina que sua máquina pode interpretar.

Você pode ler mais sobre isso nas man pages. Basta abrir um terminal e digitar man g++ .

-Wall

Esse sinalizador diz ao compilador para falar sobre quase todos os avisos (Wall = Avisar todos). Dê uma olhada no código abaixo.

int i = 1;
if (i > i) { ... }

Se você não colocar o sinalizador -Wall , nenhum aviso será exibido, mas se você vir algo como o seguinte:

warning: self-comparison always evaluates to false [-Wtautological-compare]
    if (i > i) {}

-std = c ++ 11

Com este sinalizador, você está dizendo ao compilador qual versão do idioma deve ser usada. Este é um tópico bastante complexo, mas em suma C ++ é uma linguagem viva, o que significa que ele muda horas extras e melhora, C ++ 11 é uma dessas mudanças e adiciona muitas melhorias . Hoje em dia você pode usar -std=c++14 e em algum momento deste ano você poderá usar -std=c++17 .

Você parece novo no C ++ então não se preocupe com todas as coisas desta versão! : D

-c

Compile sem vinculação.

Basicamente, permite a criação dos arquivos .o (arquivos de objetos aka), que contêm um bando de dados , principalmente código compilado e informações para o compilador ligar os objetos.

Ele torna a compilação de um grande projeto mais rápida, pois quando você altera um arquivo, ele só precisa criar um arquivo de objeto e vinculá-lo aos arquivos de objeto já compilados.

-o arquivo

Tirando da página man :

% bl0ck_qu0te%

Basicamente, este sinalizador diz ao compilador onde colocar o resultado de qualquer processo que esteja fazendo (compilar / ligar /...).

Espero que esta explicação ajude! :)

    
por Ricardo Rodrigues 06.03.2017 / 16:05
1

você deve verificar as permissões do arquivo e garantir que as permissões estejam definidas para permitir que o arquivo seja executado como um programa também ao tentar executar o arquivo que você precisa colocar a extensão .o, pois por experiência esta é a única maneira Eu tenho sido capaz de executar arquivos a partir da linha de comando

    
por LinuxSailorTech 06.03.2017 / 16:01
0
g++ -Wall -std=c++11 -c average.cpp -o average.o

Criará o arquivo average.o não o average , por isso você está recebendo no such file error

Primeiro o arquivo crate average e tente executá-lo.

Tente isto:

g++  -Wall -std=c++11 average.cpp -o average

E, em seguida, dê permissão:

   chmod +x average

execute-o

./average
    
por Rahul 06.03.2017 / 16:03