Iniciar sesión

Ver la versión completa : Cómo crear Librería estática linux exportando solo algunas funciones?



crossmax
04/06/2014, 15:19
Hola,

Como algunos me leísteis hace unos dias, estaba creando una librería y para ello necesitaba añadir otro librería externa que me fallaba. Ya lo solucioné

El caso es que he creado una librería.a y veo que para que funcione en cualquier aplicacion que programe necesito indicar donde estan las cabeceras de los objetos que añadí al crearla con:

ar -rv libMiLib-a modulo1.o modulo2.o modulo3.o

por lo que estarán disponibles todas las funciones que en las cabeceras aparezcan.
La pregunta es: ¿Como puedo hacer que al incluir mi libreria en cualquier aplicacion solo estén disponibles las funciones que yo quiera? He probado a quitarlas de las cabeceras (de los .h) pero siguen estando disponibles

Y una ultima pregunta: ¿es posible crear mi libreria incluyendo la otra libreria de terceros para que no se necesite incluir (esta ultima) al compilar la aplicacion que haga uso de mi libreria? Es decir, que solo si incluya -lMiLib.

Muchas gracias!

Propeller
04/06/2014, 16:36
Tio, con private, public, etc.

No te vendria mal mirarte algun tutorial de esos que hay por ahi...

Para hacer lo segundo que dices: una lib estatica no es mas que un archivo con .o metidos dentro. Igual podrias sacarlos y reempaquetarlos junto con los tuyos en otra lib.

crossmax
04/06/2014, 16:40
Seguro que soy un programador con prácticas muuuuy malas pero pensaba que Ansi C no tenía estos tipos de declaraciones. Me equivoco?

Enviado desde mi UMI X2 mediante Tapatalk

Propeller
04/06/2014, 17:39
Seguro que soy un programador con prácticas muuuuy malas pero pensaba que Ansi C no tenía estos tipos de declaraciones. Me equivoco?

Enviado desde mi UMI X2 mediante Tapatalk

No sabia que querias usar C. En ese caso, yo declararia esas funciones como static.

jcom
06/06/2014, 00:50
No sabia que querias usar C. En ese caso, yo declararia esas funciones como static.

En C, cuando defines algo como static, su ámbito se reduce al fichero en el que está definido. Lo mejor es tener un fichero de cabecera .h donde incluyas los prototipos de las funciones que quieres exponer y un fichero .c con las funciones completas. En el fichero .c, si defines funciones adicionales que no quieres que se expongan en la librería, tienen que ser static.

crossmax
06/06/2014, 09:56
En C, cuando defines algo como static, su ámbito se reduce al fichero en el que está definido. Lo mejor es tener un fichero de cabecera .h donde incluyas los prototipos de las funciones que quieres exponer y un fichero .c con las funciones completas. En el fichero .c, si defines funciones adicionales que no quieres que se expongan en la librería, tienen que ser static.

Ok, llevo programando tiempo en C, pero como siempre acabo haciendolo de mala manera, nunca me habia visto en este caso.
Sin embargo, al hacer una libreria, finalmente he acabado utilizando la opcion de

#define EXPORT __attribute__((visibility("default")))
Para solo hacer accesibles a las funciones que yo quiera de mi libreria. Y despues en la compilacion le paso a gcc la opcion -fvisibility=hidden.
Aqui lo dejo, por si alguien busca algo parecido.


Gracias por la respuesta de todos modos