1

私はこのコードをコンパイルしようとしました:

#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/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:In function _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:In function __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:編集しました。

4

2 に答える 2

4

gcc代わりに使用しましたg++か?

gccC ++コードで使用すると、奇妙なリンクエラーが発生します。C++コードは。でコンパイルする必要がありますg++


編集:あなたが提供した新しい情報に基づいて、私はあなたが実行していることを確認しますg++ -o main main.o main.o

代わりに次を実行する必要があります。g++ -o main main.cpp

于 2009-12-20T14:35:34.767 に答える
2

「... 動作します」と書きますが、「... リンクに関する問題」と書きます。

次の理由から、この質問には少し混乱しています。

  • リンクに問題がある場合は機能しません...
  • しかし、それが機能する場合、リンクに問題はありません...

つまり、「コンパイルはできますが、リンクエラーがあります」という意味だと思いますか?

その場合は、試すことができます

g++ -g main.cpp -o main

それ以外の

gcc -g main.cpp -o main

編集: ...コマンドラインでmain.oについて言及しないでください =;)

編集: それでも解決しない場合 - g++/gcc のインストールに何か問題があるのでしょうか?

ubuntuで試してください

sudo aptitude install build-essential
于 2009-12-20T14:53:00.690 に答える