2012-05-26 14 views
65

Sto provando del codice su Ubuntu. Sto cercando di eseguire il seguente codiceIl linker restituisce "il riposizionamento ha un simbolo non valido all'indice dei simboli ..."

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

E quando provo a compilare il codice di cui sopra utilizzando g++, ottengo il seguente errore

@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 

Qualsiasi aiuto o link a domande che aiuto sarebbe davvero utile! Grazie!

risposta

94

Non sono sicuro degli errori di trasferimento non validi, ma la cosa ovvia è che non si dispone della funzione main. È necessario definire un punto di ingresso alla vostra applicazione chiamata main, definita in ambito globale, quali:

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

gli errori di trasferimento sembravano svanire, quando ho risolto questo, grazie! – KodeSeeker

+4

Ottengo questo anche con principale definito. Cosa significherebbe l'errore allora? –

+1

@LennartRolland, potrebbe significare che non hai salvato il file chiamando 'main()'. – gsamaras

11

Il "undefined reference to 'principale'" è perché non è stato definito una funzione main(), che è la voce punto del programma:

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

È interessante notare che, ottengo lo stesso errore se provo a compilare un file .h invece di un file .c, e Link contro una biblioteca, il tutto in un solo passo.

Ecco un esempio molto ridotto:

$ 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 questo caso, la soluzione è quella di rinominare il file per finire con .c:

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

Dato che usi il driver 'g ++' e non il compilatore di backend direttamente, questo non è affatto sorprendente, però. Il driver utilizza il file spec per scoprire come gestire i file con il loro suffisso. Provalo con * qualsiasi * libreria e qualsiasi file '.h' e noterai che rilascia un file' .h.gch' (precompilato intestazione). Perché è quello che hai istruito il ** driver ** a fare. – 0xC0000022L

+0

L'errore precedente era la prima volta che osservavo il nome file del codice sorgente di input per avere un effetto sull'output di 'g ++'. Considero la causa dell'errore sia non ovvia che sorprendente. Sono beatamente inconsapevole dei file spec e dei driver del compilatore, e non avevo mai avuto bisogno di sapere in precedenza di simili stravaganze.Mentre considero la causa dell'errore sia non ovvia che sorprendente, non ho mai creduto né implicito che il comportamento sia scorretto. Allo stesso tempo, grazie per la spiegazione, anche se supera la mia conoscenza pratica di 'g ++'. – mpb

-4

Hai digitato il comando sbagliato per g ++. Si dovrebbe avere digitato qualcosa di simile:

g++ file_name random.cpp 

È necessario assegnare un nome file di output. Altrimenti è come "errore di sintassi g ++".

+5

Forse intendevi g ++ -o nome_file random.cpp – Bulletmagnet

2

Ho appena affrontato questa stessa cosa collegando in gtest con CMake e includendo un file che includeva una funzione principale.

Quindi, se sei sicuro di avere un main, e stai collegando qualcosa - assicurati di non avere due int main() s!

La soluzione semplice era dividere main() in main.cpp e non collegarlo alle origini di test.

Problemi correlati