我尝试编译此代码:
#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 "-";}
它有效,但我在使用gb与debbugging符号链接时遇到了很多问题而且它没有链接: - (
需要帮助!
大链接器错误:
facon @ facon-laptop:〜/ Windows - Mis documentos /编程/ C / Ejercicios / pedirentero $ g ++ -o main main.o main.o:在函数中 `_start':
/build/buildd/eglibc-2.10.1/csu /../ sysdeps / I386 /精灵/ 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 /精灵/ 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
_ FINI'/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 :(数据+为0x0): 首先在这里定义main.o:在功能上
__data_start': (.data+0x4): multiple definition of
__ dso_handle'/usr/lib/gcc/i486-linux-gnu/4.4.1/crtbegin.o :(数据+为0x0): 首先在这里定义main.o:在功能上
_init': (.init+0x0): multiple definition of
_ INIT'/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 / ld:警告:不能 创建.eh_frame_hdr部分, --eh-frame-hdr被忽略了。 / usr / bin / ld:main.o(.eh_frame)中的错误;没有 将创建.eh_frame_hdr表。
collect2:ld返回1退出状态
PD:已编辑。
答案 0 :(得分:4)
您是否使用gcc
代替g++
?
如果gcc
与C ++代码一起使用,则会产生奇怪的链接错误。必须使用g++
编译C ++代码。
编辑:根据您提供的新信息,我发现您正在投放g++ -o main main.o main.o
。
您应该运行:g++ -o main main.cpp
答案 1 :(得分:1)
你写“......它有效”,但是你写了“......链接问题”。
我对这个问题有点困惑,因为:
所以我猜你的意思是:“它编译,但是存在链接错误”?
如果是这种情况,那么你可以试试
g++ -g main.cpp -o main
而不是
gcc -g main.cpp -o main
编辑:...并且不在命令行上提及 main.o =;)
编辑:如果这一切都没有用 - 可能你的g ++ / gcc安装有问题吗?
在ubuntu上请尝试
sudo aptitude install build-essential