Pergunta

Eu tentei compilar este código:

#include <iostream>
#include <cstdlib>

using namespace std;

#define ARRAY_TAM 2

typedef int (*operacion)(int, int);
typedef const char* (*Pfchar)();

int suma(int, int);
int resta(int, int);

const char* descrSuma();
const char* descrResta();
const char* simbSuma();
const char* simbResta();

class OP
{
    private:

    public:
        operacion op;
        Pfchar descr;
        Pfchar simb;

};

int main (int argv, char *argc[])
{
    OP ArrayOP[ARRAY_TAM];

    ArrayOP[0].op = suma;
    ArrayOP[0].descr = descrSuma;
    ArrayOP[1].op = resta;
    ArrayOP[1].descr = descrResta;

    int op1, op2;
    unsigned int i;
    char opcion;
    bool fin = false;

    while (fin != true)
    {
        cout << "CALCULADORA" << "\n";
        cout << "===========" << "\n";

        for (i = 0; (i < ARRAY_TAM); i++)
        {
            cout << i+1;
            cout << ".- ";
            cout << ArrayOP[i].descr() << "\n";
        }

        cout << i+1 << ".- " << "Salir" << endl;

        cout << "Opcion: ";

        cin >> opcion;
        opcion = atoi(&opcion);
        opcion--;
        cout << (int)opcion << endl;

        if ((opcion >= 0) && (opcion < ARRAY_TAM))
        {
            cout << "Operando 1: ";
            cin >> op1;
            cout << "Operando 2: ";
            cin >> op2;
            cout << "Resultado: op1 " << ArrayOP[opcion].simb()
                         << " op2 = " << ArrayOP[opcion].op(op1, op2);
        }   
        else if (opcion == ARRAY_TAM)
        {
            fin = true;
        }

    }

    return 0;

}


int suma (int op1, int op2)
{return op1 + op2;}

int resta (int op1, int op2)
{return op1 - op2;}

const char* descrSuma()    
{return "Suma";}

const char* descrResta() 
{return "Resta";}

const char* simbSuma()
{return "+";}

const char* simbResta()
{return "-";}

E funciona, mas tenho muitos problemas em vincular ao GCC com símbolos Debbugging e ele não vincula :-(

Preciso de ajuda!

Grande erro de vinculador:

Facon@Facon -laptop: ~/Windows -mis documentos/prog/c/ejercicios/pedirentero $ g ++ -o main.o main.o: na função `_start ':

/build/buildd/eglibc-2.10.1/csu/../sysdeps/i386/elf/start.s:65: Definição múltipla de `_start '

/usr/lib/gcc/i486-linux-gnu/4.4.1/../../../../lib/crt1.o:/build/buildd/eglibc-2.10.1/csu/ .. /sysdeps/i386/elf/start.s:65:

Primeiro definido aqui Main.O :(. Rodata+0x0): Definição múltipla de `_fp_hw '

/usr/lib/gcc/i486-linux-gnu/4.4.1/../../../../lib/crt1.o:(.rodata+0x0): Primeiro definido aqui main.o: em função _fini': (.fini+0x0): multiple definition of_fini '

/usr/lib/gcc/i486-linux-gnu/4.4.1/../../../../lib/crti.o:(.fini+0x0): Primeiro definido aqui main.o :( .Rodata+0x4): Definição múltipla de `_io_stdin_used '

/usr/lib/gcc/i486-linux-gnu/4.4.1/../../../../lib/crt1.o:(.rodata.cst4+0x0): Primeiro definido aqui main.o : Em função __data_start': (.data+0x0): multiple definition of__data_start '

/usr/lib/gcc/i486-linux-gnu/4.4.1/../../../../lib/crt1.o:(.data+0x0): Primeiro definido aqui main.o: em função __data_start': (.data+0x4): multiple definition of__dso_handle '

/usr/lib/gcc/i486-linux-gnu/4.4.1/crtbegin.o:(.data+0x0): primeiro definido aqui main.o: na função _init': (.init+0x0): multiple definition of_iniciar'

/usr/lib/gcc/i486-linux-gnu/4.4.1/../../../../lib/crti.o:(.init+0x0): Primeiro definido aqui

/usr/lib/gcc/i486-linux-gnu/4.4.1/crtend.o:(.dTors+0x0): Definição múltipla de `Dtor_end'Main.O :(. DTORS+0X4): Primeiro definido aqui

/usr/bin/ld: aviso: não é possível criar a seção .eh_frame_hdr, --eh-frame-hdr ignorado. /usr/bin/ld: erro em main.o (.eh_frame); Não .eh_frame_hdr tabela será criada.

Collect2: LD retornou 1 status de saída

PD: Editado.

Foi útil?

Solução

Você escreve "... funciona", mas então você escreve "... problemas com vinculação".

Estou um pouco confuso com esta pergunta, porque:

  • Se houver problemas com vincular, então não funciona ...
  • Mas se funcionar, então você não tem Problemas com vinculação ...

Então eu acho que você quer dizer: "Compila, mas há erros de vinculação"?

Se for esse o caso, você pode tentar

g++ -g main.cpp -o main

ao invés de

gcc -g main.cpp -o main

Editar: ... e fazer não menção main.o na linha de comando =;)

EDIT: Se tudo isso não ajudar - talvez haja algo errado com sua instalação G ++/GCC?

no Ubuntu, por favor tente

sudo aptitude install build-essential

Outras dicas

Você usou gcc ao invés de g++?

Se gcc é usado com código C ++, ele fornecerá erros de vinculação estranhos. O código C ++ deve ser compilado com g++.


EDITAR: Com base nas novas informações que você forneceu, vejo que você está executando g++ -o main main.o main.o.

Você deve correr: em vez disso: g++ -o main main.cpp

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top