2012-05-26 26 views
65

Estoy probando un código en Ubuntu. Estoy tratando de ejecutar el siguiente códigoEl enlazador devuelve "la reubicación tiene un símbolo no válido en el índice de símbolo ..."

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

Y cuando intento compilar el código anterior utilizando g++, me sale el siguiente error

@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 

Cualquier ayuda o enlaces a las preguntas que ayuda sería ¡de mucha ayuda! ¡Gracias!

Respuesta

94

No estoy seguro acerca de sus errores de reubicación no válidos, pero lo obvio que falta es que no tiene la función main. Es necesario definir un punto de entrada a su aplicación llamada main, definido en el ámbito global, tales como:

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

los errores de reubicación parecían desaparecer, cuando arreglé esto, ¡Gracias! – KodeSeeker

+4

Lo consigo incluso con el principal definido. ¿Qué significaría el error entonces? –

+1

@LennartRolland, puede significar que no ha guardado el archivo que invoca 'main()'. – gsamaras

11

La "referencia indefinida a 'principal'" se debe a que no ha definido una función main(), que es la entrada punto de su programa:

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

Curiosamente, me sale el mismo error si intento compilar un archivo .h lugar de un archivo .c, y el enlace con una biblioteca, todo en un solo paso.

Aquí está un ejemplo muy reducido:

$ 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 

En este caso, la solución es cambiar el nombre del archivo para terminar con .c:

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

Dado que usas el controlador 'g ++' y no el compilador de back-end directamente, esto no es en absoluto sorprendente. El controlador usa el archivo de especificaciones para descubrir cómo manejar los archivos por su sufijo. Pruébelo con * cualquier * biblioteca y cualquier archivo '.h' y notará que deja caer un archivo' .h.gch' (encabezado precompilado). Porque eso es lo que instruyó al ** conductor ** a hacer. – 0xC0000022L

+0

El error anterior fue la primera vez que observé el nombre de archivo del código fuente de entrada para tener un efecto en la salida de 'g ++'. Considero que la causa del error es no obvia y sorprendente. Estoy felizmente desconocedor de los archivos de especificaciones y los controladores del compilador, y nunca antes tuve la necesidad de conocer esos caprichos.Aunque considero que la causa del error no es tan obvia ni sorprendente, nunca he creído ni insinuado que el comportamiento sea incorrecto. Al mismo tiempo, gracias por la explicación, incluso si excede mi conocimiento práctico de 'g ++'. – mpb

-4

Ha escrito comando incorrecto para g ++. Debería haber escrito algo como:

g++ file_name random.cpp 

Debe nombrar el archivo de salida. De lo contrario, es como "error de sintaxis g ++".

+5

Quizás se refirió a g ++ -o nombre_de_archivo random.cpp – Bulletmagnet

2

Acabo de enfrentar lo mismo al vincular gtest con CMake e incluir un archivo que incluía una función principal.

Por lo tanto, si está seguro de que tiene una fuente principal y está vinculando algo, asegúrese de que no tenga dos int main() s.

La solución simple era dividir el main() en main.cpp y no vincularlo con las fuentes de prueba.

Cuestiones relacionadas