2012-05-26 1 views
65

私はUbuntuでいくつかのコードを試しています。私は、次のコードリンカは "再配置にシンボルインデックスに無効なシンボルがあります..."を返します

#include <cstdlib> 
#include <cmath> 
#include <ctime> 
#include "random.h" 

using namespace std; 

/* Function prototype! */ 
void initRandomSeed(); 

int randomInteger(int low,int high){ 
    initRandomSeed(); 
    double d= rand()/(double(RAND_MAX)+1); 
    double s= d*(double(high)-low+1); 
    return int(floor(low)+s);  
} 

double randomReal(int low,int high){ 
    initRandomSeed(); 
    double d=rand()/(double(RAND_MAX)+1); 
    double s=d*(double(high)-low+1); 
    return low+s; 
}  

bool randomChance(double p){ 
    initRandomSeed(); 
    return randomReal(0,1)<p; 
}    

void setRandomSeed(int seed){  
    initRandomSeed(); 
    srand(seed); 
}  

void initRandomSeed(){ 
    // to retain updated values across different stack frames! nice! 
    static bool initialized=false; 

    // this is executed only very first time and random value obtained from system clock! 
    if(!initialized){ 
     srand(int(time(NULL))); 
     initialized=true; 
    } 
} 

を実行しようとしていると私はg++を使用して、上記のコードをコンパイルしようとすると、私は次のエラー

@ubuntu:~/Chardway$ g++ random.cpp 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 0 has invalid symbol index 10 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 1 has invalid symbol index 11 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 2 has invalid symbol index 2 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 3 has invalid symbol index 2 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 4 has invalid symbol index 10 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 5 has invalid symbol index 12 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 6 has invalid symbol index 12 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 7 has invalid symbol index 12 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 8 has invalid symbol index 2 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 9 has invalid symbol index 2 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 10 has invalid symbol index 11 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 11 has invalid symbol index 12 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 12 has invalid symbol index 12 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 13 has invalid symbol index 12 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 14 has invalid symbol index 12 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 15 has invalid symbol index 12 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 16 has invalid symbol index 12 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 17 has invalid symbol index 12 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 18 has invalid symbol index 12 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 19 has invalid symbol index 12 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 20 has invalid symbol index 19 
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o: In function `_start': 
(.text+0x20): undefined reference to `main' 
collect2: ld returned 1 exit status 

に助けは次のようになり質問へのすべてのヘルプやリンクを取得します本当に役に立ちました!ありがとう!

答えて

94

無効な再配置エラーについてはわかりませんが、明白な欠点は、main機能がないことです。次のようなグローバルスコープで定義され、アプリケーションにエントリポイントを定義する必要がありmainと呼ばれる:「『メイン』への未定義参照」

int main() 
{ 
    // TODO: implementation 
} 
+0

再配置エラーが消えてしまったようですが、これを修正しました。ありがとう! – KodeSeeker

+4

私はこれをメイン定義でも得ます。それではエラーはどういう意味ですか? –

+1

@LennartRollandの場合、 'main()'を呼び出すファイルを保存していない可能性があります。 – gsamaras

11

あなたがエントリーされmain()機能を定義していなかったためでありますあなたのプログラムのポイント:私はすべて1つのステップで、ライブラリに対する.h代わり.cファイルのファイル、およびリンクをコンパイルしようとした場合

int main() 
{ 
    // call other functions 
} 
7

は興味深いことに、私は同じエラーを取得します。ここで

を大幅に削減例です。この場合は

$ echo 'int main() {}' > test.h 
$ g++ test.h -ltommath && echo success 
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o: In function `_start': 
(.text+0x20): undefined reference to `main' 
collect2: error: ld returned 1 exit status 

、解決策は.cで終了するファイルの名前を変更することです:あなたはg ++のために間違ったコマンドを入力した

$ echo 'int main() {}' > test.c 
$ g++ test.c -ltommath && echo success 
success 
+0

バックエンドコンパイラではなくg ++ドライバを直接使用するので、これはまったく驚くことではありません。ドライバはspecファイルを使用して、ファイルを接尾辞でどのように扱うかを調べます。 *任意のライブラリと任意の '.h'ファイルで試してみてください。' .h.gch'(プリコンパイルされたヘッダ)ファイルが削除されていることに気づくでしょう。それはあなたが**ドライバー**に何を指示したからですか? – 0xC0000022L

+0

上記のエラーは、 'g ++'の出力に影響を与える入力ソースコードのファイル名を初めて見たことがあります。私はエラーの原因が不明瞭で驚くべきものであると考えています。私はblissfullyスペックファイルとコンパイラドライバを認識していない、と私は以前にそのような変化について知る必要はありませんでした。私は間違いの原因が明らかではなく、驚くべきものだと考えていますが、私はその行動が間違っていると信じたり、暗示したりしたことは一度もありません。同時に、g ++の実用知識を上回っていても、説明に感謝します。 – mpb

-4

g++ file_name random.cpp 

出力ファイルに名前を付ける必要があります。それ以外の場合は、「g ++構文エラー」のようになります。

+5

おそらくあなたのことを意味する g ++ -o file_name random.cpp – Bulletmagnet

2

私は、gtestとCMakeをリンクしてmain関数を含むファイルを含むときに、同じことに直面しました。

メインを持っていて、何かをリンクしている場合は、int main()が2つありません。

簡単な解決策はmain()をmain.cppに分割し、テストソースとリンクさせないことでした。

関連する問題