Ошибка связи с gcc - PullRequest
       17

Ошибка связи с gcc

1 голос
/ 20 декабря 2009

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

#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 main.o main.o: в функции `_Start ':

/ BUILD / buildd / eglibc-2.10.1 / ХСС /../ sysdeps / i386 / эльфа / start.S: 65: множественное определение `_start '

/ USR / Библиотека / GCC / i486-Linux-гну / 4.4.1 /../../../../ Библиотека / crt1.o: /build/buildd/eglibc-2.10.1/csu /../sysdeps/i386/elf/start.S:65:

впервые определено здесь main.o :(. rodata + 0x0): несколько определение `_fp_hw '

/ USR / Библиотека / GCC / i486-Linux-ГНУ / 4.4.1 /../../../../ Библиотека / crt1.o :( rodata + 0x0).: сначала определено здесь main.o: в функции _fini': (.fini+0x0): multiple definition of _fini '

/ USR / Библиотека / GCC / i486-Linux-ГНУ / 4.4.1 /../../../../ Библиотека / crti.o :( Фини + 0x0).: сначала определено здесь main.o :(. rodata + 0x4): несколько определение `_IO_stdin_used '

* * Тысячу двадцать-три / USR / Библиотека / GCC / i486-Linux-ГНУ / 4.4.1 /../../../../ Библиотека / crt1.o :( rodata.cst4 + 0x0).: сначала определено здесь main.o: в функции
__data_start': (.data+0x0): multiple definition of __ data_start '

/ USR / Библиотека / GCC / i486-Linux-ГНУ / 4.4.1 /../../../../ Библиотека / crt1.o :( данные + 0x0).: сначала определено здесь main.o: в функции __data_start': (.data+0x4): multiple definition of __ dso_handle '

/ USR / Библиотека / GCC / i486-Linux-ГНУ / 4.4.1 / crtbegin.o :( данные + 0x0).: сначала определено здесь main.o: в функции _init': (.init+0x0): multiple definition of _init '

* +1032 * / USR / Библиотека / GCC / i486-Linux-ГНУ / 4.4.1 /../../../../ Библиотека / crti.o :( INIT + 0x0).: впервые определено здесь * 1 034 * / USR / Библиотека / GCC / i486-Linux-ГНУ / 4.4.1 / crtend.o :( dtors + 0x0).: множественное определение ` DTOR_END ' main.o :(. dtors + 0x4): здесь впервые определено

/ usr / bin / ld: предупреждение: невозможно создать раздел .eh_frame_hdr, --eh-frame-hdr игнорируется. / usr / bin / ld: ошибка в main.o (.eh_frame); нет Таблица .eh_frame_hdr будет создана.

collect2: ld вернул 1 статус выхода

PD: отредактировано.

Ответы [ 2 ]

4 голосов
/ 20 декабря 2009

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

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


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

Вместо этого вы должны выполнить: g++ -o main main.cpp

1 голос
/ 20 декабря 2009

Вы пишете "... это работает", но затем вы пишете "... проблемы со связыванием".

Я немного запутался с этим вопросом, потому что:

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

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

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

g++ -g main.cpp -o main

вместо

gcc -g main.cpp -o main

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

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

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

sudo aptitude install build-essential
...