【问题标题】:Error linking with gcc与 gcc 链接时出错
【发布时间】:2010-12-28 12:02:48
【问题描述】:

我尝试编译这段代码:

#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 - 误 文档/Prog/C/Ejercicios/pedirentero$ g++ -o main 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_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:(.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_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:已编辑。

【问题讨论】:

  • 请编辑您的代码以删除不必要的垂直空白。并且“很多问题”并没有给我们任何继续 - 发布您收到的具体错误消息。
  • 对不起,我下次再做

标签: c++ gcc linker gcc4


【解决方案1】:

您是否使用gcc 而不是g++

如果gcc 与 C++ 代码一起使用,则会出现奇怪的链接错误。 C++代码必须用g++编译。


编辑:根据您提供的新信息,我看到您正在运行g++ -o main main.o main.o

您应该改为运行:g++ -o main main.cpp

【讨论】:

  • gcc a g++ 也是如此。
  • 什么是“相同”?您从未准确解释过错误是什么
  • 在该屏幕截图中,您再次运行 main.o 而不是 main.cpp
  • 请不要使用:g++ -g main.cpp main.o。那是错误的。使用:g++ -g main.cpp -o main
【解决方案2】:

你写的是“……它可以工作”,然后你写的是“……链接问题”。

我对这个问题有点困惑,因为:

  • 如果链接有问题,那么它不起作用 ...
  • 但如果它有效,那么您没有链接问题...

所以我猜你的意思是:“它编译,但有链接错误”?

如果是这样,那你可以试试

g++ -g main.cpp -o main

而不是

gcc -g main.cpp -o main

编辑:...并在命令行中提及 ma​​in.o =;)

编辑:如果这一切都没有帮助 - 也许你的 g++/gcc 安装有问题?

在ubuntu上请尝试

sudo aptitude install build-essential

【讨论】:

  • 它在链接时也是如此,我想,我没有调试库或类似的东西。
  • 这是一个什么样的开发环境? linux?赛格温?明吗?
  • 哪个版本的 Ubuntu?业力? Ubuntu 是 32 位还是 64 位?
  • ... 你是如何安装 gcc/g++ 的?我建议您使用 sudo aptitude install build-essential
  • Karmic Koala 9.10,32 位。当我开始用 C/C++ 编程时,我就这样做了
猜你喜欢
  • 2012-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-25
  • 1970-01-01
  • 2021-05-07
  • 1970-01-01
相关资源
最近更新 更多