与gcc链接时出错

时间:2009-12-20 14:19:38

标签: c++ gcc linker gcc4

我尝试编译此代码:

#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:已编辑。

2 个答案:

答案 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