Вопрос

Я попытался скомпилировать этот код:

#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 "-";}

Это работает, но у меня много проблем с связыванием с gcc с символами отладки, и он не связывается :-(

Нужна помощь!

Большая ошибка компоновщика:

facon@facon -laptop: ~/windows -mis documentos/prog/c/ejercicios/pedirentero $ g ++ -o main.o main.o:В функции `_start ':

/build/buildd/eglibc-2.10.1/csu/../sysdeps/i386/elf/start.S:65:множественное определение `_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:

сначала определено здесь main.o :(. Rodata+0x0):Несколько определений `_fp_hw '

/usr/lib/gcc/i486-linux-gnu/4.4.1/../../../../lib/crt1.o:(.rodata+0x0):впервые определено здесь main.o:В функции _fini': (.fini+0x0): multiple definition of_фини'

/usr/lib/gcc/i486-linux-gnu/4.4.1/../../../../lib/crti.o:(.fini+0x0):сначала определено здесь main.o :(. Rodata+0x4):Несколько определений `_io_stdin_used '

/usr/lib/gcc/i486-linux-gnu/4.4.1/../../../../lib/crt1.o:(.rodata.cst4+0x0):впервые определено здесь main.o:В функции __data_start': (.data+0x0): multiple definition of__data_start'

/usr/lib/gcc/i486-linux-gnu/4.4.1/../../../../lib/crt1.o:(.data+0x0):впервые определено здесь main.o:В функции __data_start': (.data+0x4): multiple definition of__dso_handle'

/usr/lib/gcc/i486-linux-gnu/4.4.1/crtbegin.o:(.data+0x0):впервые определено здесь main.o:В функции _init': (.init+0x0): multiple definition of_в этом'

/usr/lib/gcc/i486-linux-gnu/4.4.1/../../../../lib/crti.o:(.init+0x0):впервые определено здесь

/usr/lib/gcc/i486-linux-gnu/4.4.1/crtend.o:(.dtors+0x0):множественное определение `DTOR_END'main.o :(. Dtors+0x4):впервые определено здесь

/usr/bin/лд:предупреждение:Не может создать раздел .eh_frame_hdr,-EH-Frame-HDR игнорируется./usr/bin/лд:ошибка в main.o(.eh_frame);НЕТ .EH_FRAME_HDR Таблица будет создана.

собирать2:ld вернул 1 статус выхода

ПД:Отредактировано.

Это было полезно?

Решение

Ты пишешь "...работает", но потом пишешь "...проблемы со связью».

Меня немного смущает этот вопрос, потому что:

  • Если есть проблемы со связью, то это не работает ...
  • Но если это сработает, то вы не имею проблемы со связью...

Я так понимаю, вы имеете в виду:«он компилируется, но есть ошибки связывания»?

Если это так, то можно попробовать

g++ -g main.cpp -o main

вместо

gcc -g main.cpp -o main

РЕДАКТИРОВАТЬ:...и делай нет упомянуть main.o в командной строке =;)

РЕДАКТИРОВАТЬ:если все это не помогает - возможно, что-то не так с вашей установкой g++/gcc?

на Ubuntu, пожалуйста, попробуйте

sudo aptitude install build-essential

Другие советы

Ты использовал gcc вместо g++?

Если gcc используется с кодом C++, это приведет к странным ошибкам связывания.Код C++ должен быть скомпилирован с g++.


РЕДАКТИРОВАТЬ:На основании предоставленной вами новой информации я вижу, что вы работаете g++ -o main main.o main.o.

Вместо этого вам следует запустить: g++ -o main main.cpp

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top