2010-01-21 17 views
7

Estoy usando gcc para compilar un programa que necesito vincular a una biblioteca C con un nombre no estándar; se llama stuff.a en lugar de libstuff.a.Vinculación de la biblioteca C con nombre no estándar

No puedo cambiar el nombre del archivo (problemas de permisos).

no quiero que incluya la biblioteca completa (es decir, usando gcc program.c stuff.a -oprogram)

quiero compilar como gcc program.c -L/path/to/library/ -lstuff -oprogram pero gcc no se encuentra la biblioteca (porque no se llama libstuff.a).

Estoy trabajando en una caja de Linux.

¿Cómo puedo obtener el enlace (dinámico) hecho?

EDIT:

todos ustedes, y mis disculpas Gracias por una pregunta mal redactado.

Ni siquiera tenía un objeto compartido (pensé que podía vincular dinámicamente a un archivo * .a), por lo que esto confundió a muchos de ustedes. Nuevamente, disculpas por mi ignorancia.

Lo que terminé haciendo es crear el objeto compartido en un directorio local, agregando la ubicación a mi variable de entorno LD_LIBRARY_PATH y volviendo a vincular.

Funciona como un amuleto (desde 1.3M ejecutable hasta 5.8K).

Gracias de nuevo.

+0

¿existe una versión de objetos compartidos de la biblioteca (stuff.so)? – jschmier

+0

olvidé mencionar, estoy trabajando en Linux. – Escualo

+0

@jschmier: no, solo la biblioteca '.a'. – Escualo

Respuesta

6

Suponiendo que no existe una versión de objeto compartido de la biblioteca estática, puede ser necesario crear una. Recuerde que la biblioteca estática stuff.a es solo un archivo ar.

ar -x stuff.a 
gcc -shared *.o -o libstuff.so 

Esto supone que usted quiere vincular en contra de ella como una biblioteca compartida y no simplemente compilarlo en su binario.

+6

Interesante, pero los archivos .o deben haberse compilado como código de posición independiente para que esto funcione, lo cual puede no haber sido si estuvieran destinados a una biblioteca estática, ¿no? –

+1

Esta es la respuesta correcta porque ni siquiera tenía un objeto compartido. Terminé creando uno y enlazando. Desde un ejecutable de 1.3M (con el enfoque original) pasé a un ejecutable de 5.8K. Esto es asombroso Gracias. – Escualo

+1

+1 para el uso avanzado de la bola de cristal o capacidades de lectura mental;) – Christoph

4

¿Puedes crear un enlace simbólico al stuff.a llamado libstuff.a? Incluso podría hacer el enlace simbólico en otro directorio (es decir, no en un directorio de biblioteca estándar) y usar la opción -L con gcc para incluir el directorio con el enlace simbólico.

+0

Estaba pensando en hacer esto, y puede que sea lo que termine haciendo. Me preguntaba si existe un indicador especial que pueda pasar a gcc para informarle que el nombre no es estándar. – Escualo

3

enlace como lo haría con un archivo de objeto:

gcc blah.o /usr/local/lib/foo.a -o binary 

si no te gusta ruta completa, sólo tiene que utilizar una variable. de lo contrario podría analizar el archivo LD_LIBRARY_PATH y la prueba de la existencia allí

+0

@Arrieta: no de acuerdo con el manual de gcc – Christoph

+0

Gracias, desconocido, no lo hice ahora. – Escualo

+1

no puede vincular dinámicamente a la biblioteca estática, debe ser un enlace estático de tiempo de compilación. los objetos compartidos deben compilarse con PIC, las bibliotecas estáticas normalmente no se compilan así. todavía tiene que cargar la biblioteca compartida en la memoria en tiempo de ejecución, a menos que esté ejecutando varios subprocesos, no ganará mucho – Anycorn

1

Sólo dar el nombre completo:

gcc program.c /path/to/library/stuff.a -oprogram 
5

Debería haber echado un vistazo a la gcc manual:

La única diferencia entre usar una -l opción y especificando un nombre de archivo es que -l rodea la biblioteca con 'lib' y '.a' y busca varios directorios .

No tiene nada de malo utilizar stuff.a como argumento.

+0

Hubo un "(dinámico)" en la pregunta original, pero estoy cada vez menos seguro de que el OP realmente lo quiso decir. –

+0

Gracias. No estaba al tanto de esto, y con el tuyo y otros comentarios ahora puedo resolver mi problema. – Escualo

0

Sé que el problema resultó ser uno con el intento de establecer una biblioteca estática como dinámicamente vinculados, pero quería añadir esto para la posteridad:

Si prefacio de su argumento de la opción -l con dos puntos , :, tratará el nombre como literal en lugar de un nombre que necesite la "lib" añadida al frente y la extensión de archivo agregada al final.

En el caso que usted describe en la que desea enlazar con una static.a en lugar de un libstatic.a, y suponiendo que tienen la intención de vincular en contra de ella de forma estática, la siguiente funcionaría:

gcc program.c -L/path/to/library/ -l:stuff.a -oprogram 

Se podría, por supuesto hacer como Richard Penington y Anycorn han mencionado tanto y simplemente incluir la biblioteca pathed totalmente en la línea de comandos en lugar así:

gcc program.c /path/to/library/stuff.a -oprogram 
Cuestiones relacionadas