Pregunta

Tengo dos archivos -> fact.h y main.c en el /home/snyp1/new carpeta. main.c tiene la función principal que llama a la fact(int x) función en fact.h.Estoy creando un .a archivo con el ar comando ->

snyp1@Snyp:~/new$ ar -r -s libfact.a fact.o
ar: creating libfact.a
fact.h  fact.o  libfact.a  main.c
snyp1@Snyp:~/new$ gcc main.c -L/home/snyp1/new -lfact -o main
/home/snyp1/new/libfact.a: could not read symbols: Archive has no index; run ranlib to add one
collect2: ld returned 1 exit status
snyp1@Snyp:~/new$ ranlib libfact.a
snyp1@Snyp:~/new$ gcc main.c -L/home/snyp1/new -lfact -o main
/home/snyp1/new/libfact.a: could not read symbols: Archive has no index; run ranlib to add one
collect2: ld returned 1 exit status

Estoy en ubuntu 12.04.Por favor, hágamelo saber cuál es incorrecto.(También, si yo no uso el -L/.../new, gcc le dice que no puede encontrar "lfact", tal vez porque no en /usr/local/lib)

EDITAR:OK he encontrado la causa.Es debido a el hecho de que yo estaba usando fact.h para construir el fact.o y luego ponerlo en la biblioteca, no estaba funcionando como se esperaba.Por lo tanto, ahora transformado en file.c y está funcionando bien ahora.Yo debería haber proporcionado esa información, lo siento.Aunque no sé por qué este tipo de problema debe surgir.No son las bibliotecas posible hacer sin al menos una .c archivo en ella?

¿Fue útil?

Solución

Yo estaba usando un hecho.h para generar el hecho.o y, a continuación, ponerlo en la biblioteca, no estaba funcionando como se esperaba.

¿Te refieres a que se compilaba fact.h para producir fact.o?

Si es así, que no estaba haciendo lo que usted espera.Cuando se invoca gcc en un archivo de encabezado que produce un archivo de encabezado precompilado, no un objeto de archivo.Así que aunque usted tiene un archivo llamado foo.o no era un objeto válido de archivo.Si se había quedado solo gcc -c fact.h se habría producido un archivo de encabezado precompilado fact.gch, pero es de suponer que usted corrió gcc -c fact.h -o fact.o que hace que el archivo que se llama fact.o aunque aún se trata de un archivo de encabezado precompilado. file fact.o habría demostrado que:

$ file fact.o
fact.o: GCC precompiled header (version 013) for C

Usted podría haber forzado GCC para tratar el archivo como código C, no un encabezado, mediante la ejecución de gcc -x c -c fact.h -o fact.o (el -x c dice que para el tratamiento de la entrada como el código C en lugar de inferir el tipo de la extensión del archivo), pero es probablemente más sencillo y menos confuso sólo el nombre de su archivo correctamente en lugar de intentar compilar un encabezado.

No son las bibliotecas posible hacer sin al menos uno .c archivo en ella?

Se necesitan por lo menos un archivo objeto (es decir, .o archivo), pero usted no tiene un objeto válido, había un archivo de encabezado precompilado llamado erróneamente como .o, pero no era en realidad un objeto de archivo.

si yo no uso el -L/.../new, gcc le dice que no puede encontrar "lfact", tal vez porque no en /usr/local/lib

El vinculador no solo se ve en /usr/local/lib, hay otro defecto de los lugares en que se ve, pero sí, ese es básicamente el problema.Tenga en cuenta que también se puede decir -L. si la biblioteca está en el directorio actual, que es más fácil que dar una ruta de acceso absoluta.

Otros consejos

No estoy seguro ar soporta un tablero en otra cosa que la primera opción.Trate de

ar -rs libfact.a fact.o

o simplemente

ar rs libfact.a fact.o

La mente, no sé por qué la ejecución de ranlib no trabajo aunque.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top