Ошибка связывания с gcc
Вопрос
Я попытался скомпилировать этот код:
#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