2012-05-26 4 views
65

Ich probiere etwas Code auf Ubuntu aus. Ich versuche, den folgenden CodeLinker gibt "Umzug hat ein ungültiges Symbol am Symbol Index ..." zurück

#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; 
    } 
} 

Und laufen, wenn ich versuche, den obigen Code mit g++ zu kompilieren, bekomme ich würde die folgenden Fehler

@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 

Jede Hilfe oder Links zu Fragen, die helfen wirklich hilfreich! Vielen Dank!

Antwort

94

Ich bin mir nicht sicher über Ihre ungültigen Umzug Fehler, aber die offensichtliche fehlende Sache ist, dass Sie keine main Funktion haben. Sie benötigen einen Einstiegspunkt für Ihre Anwendung definieren main genannt, im globalen Bereich definiert, wie:

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

die Umzug Fehler schien zu verschwinden, als ich das behoben, Danke! – KodeSeeker

+4

Ich bekomme das sogar mit Haupt definiert. Was würde der Fehler dann bedeuten? –

+1

@LennartRolland, könnte es bedeuten, dass Sie die Datei 'main()' nicht gespeichert haben. – gsamaras

11

Die „undefined reference to‚main‘“ ist, weil Sie keine main() Funktion definiert haben, die der Eintrag Punkt des Programms:

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

Interessanterweise habe ich den gleichen Fehler, wenn ich versuche, eine .h Datei anstelle eine .c Datei und Link gegen eine Bibliothek, die alle in einem Schritt zu kompilieren.

hier ein stark reduziert Beispiel:

$ 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 

In diesem Fall ist die Lösung, um die Datei umzubenennen mit .c zu beenden:

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

Da Sie den 'g ++' Treiber und nicht den Back-End-Compiler direkt verwenden, ist dies jedoch überhaupt nicht überraschend. Der Treiber verwendet die Spezifikationsdatei, um herauszufinden, wie Dateien mit ihrem Suffix behandelt werden. Probieren Sie es mit * any * library und jeder '.h' Datei aus und Sie werden bemerken, dass es eine' .h.ch'-Datei (vorkompilierte Header) löscht. Denn das hast du dem ** Fahrer ** angewiesen. – 0xC0000022L

+0

Der obige Fehler war das erste Mal, dass ich beobachtet habe, dass der Dateiname des Quelltexts sich auf die Ausgabe von 'g ++' auswirkt. Ich betrachte die Ursache des Fehlers als nicht naheliegend und überraschend. Ich weiß glücklicherweise nichts von spec-Dateien und Compiler-Treibern, und ich musste vorher nie über solche Launen Bescheid wissen.Während ich die Ursache des Fehlers als nicht offensichtlich und überraschend betrachte, habe ich nie geglaubt, dass das Verhalten falsch ist. Zur gleichen Zeit, danke für die Erklärung, auch wenn es meine Kenntnisse von 'g ++' übersteigt. – mpb

-4

Sie falsche Befehl für g ++ eingegeben haben. Sie sollten etwas eingegeben haben wie:

g++ file_name random.cpp 

Sie müssen Ausgabedatei benennen. Ansonsten ist es wie "g ++ Syntaxfehler".

+5

Vielleicht meintest du g ++ -o Dateiname random.cpp – Bulletmagnet

2

Ich sah gerade dasselbe, wenn ich in gtest mit CMake verknüpfte und eine Datei mit einer Hauptfunktion einschloss.

Also, wenn Sie sicher sind, dass Sie eine Hauptleitung haben, und Sie etwas verknüpfen - stellen Sie sicher, dass Sie nicht zwei int main() s haben!

Eine einfache Lösung bestand darin, die main() in main.cpp aufzuteilen und nicht mit den Testquellen zu verknüpfen.

Verwandte Themen