Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
1 / 26
Contenido
1
Ejemplo sencillo
C
odigo ejemplo monoltico
10
Aplicaciones u
tiles para archivos .o, .a y .so
11
C
omo crear y usar una biblioteca en Vala
12
4 / 26
Ejemplo sencillo I
Veamos en qu
e consiste una biblioteca con un ejemplo. . .
Para ello partimos de un c
odigo monoltico donde el programa
compresion/descompresi
on sobre cadenas.
Invocado de esta forma:
comp-decomp -c ccccaassssssssaaaaaaa
5 / 26
Ejemplo sencillo II
Monol
tica
libcomp-decomp.a
libcomp-decomp.so
Enlace est
atico
Enlace din
amico
comp-decomp.c
comp.h
comp.c
decomp.h
decomp.c
6 / 26
Ejemplo sencillo II
Monol
tica
libcomp-decomp.a
libcomp-decomp.so
Enlace est
atico
Enlace din
amico
comp-decomp.c
comp.h
comp.c
decomp.h
decomp.c
6 / 26
Ejemplo sencillo II
Monol
tica
libcomp-decomp.a
libcomp-decomp.so
Enlace est
atico
Enlace din
amico
comp-decomp.c
comp.h
comp.c
decomp.h
decomp.c
6 / 26
Ejemplo sencillo II
Monol
tica
libcomp-decomp.a
libcomp-decomp.so
Enlace est
atico
Enlace din
amico
comp-decomp.c
comp.h
comp.c
decomp.h
decomp.c
6 / 26
Ejemplo sencillo II
Monol
tica
libcomp-decomp.a
libcomp-decomp.so
Enlace est
atico
Enlace din
amico
comp-decomp.c
comp.h
comp.c
decomp.h
decomp.c
6 / 26
1
3
5
7
#i n c l u d e <s t d i o . h>
#i n c l u d e <s t d l i b . h>
#i n c l u d e <s t r i n g . h>
/ D e v u e l v e e l numero de c a r a c t e r e s i g u a l e s a l p r i m e r o de s /
s t a t i c i n t c a r a c t e r e s i g u a l e s ( char s ) {
int l = 0;
i n t cont = 1;
9
i f ( s == NULL) r e t u r n 0 ;
11
l = strlen (s) ;
i f ( l < 2)
return l ;
else {
int i = 1;
w h i l e ( s [ 0 ] == s [ i ++])
c o n t ++;
return cont ;
}
13
15
17
19
21
7 / 26
5
if ( s == NULL )
return ;
7
l = strlen ( s ) ;
if ( l < 3) strcat ( cs , s ) ;
else {
int csl = 0;
cont = c a r a c t e r e s _ i g u a l e s ( s ) ;
if ( cont > 2) {
sprintf ( num , " %d " , cont ) ;
strcat ( cs , num ) ;
csl = strlen ( cs ) ;
cs [ csl ++] = s [0];
cs [ csl ] = \0 ;
} else {
csl = strlen ( cs ) ;
for ( i = 0; i < cont ; i ++)
cs [ csl ++] = s [0];
cs [ csl ] = \0 ;
}
9
11
13
15
17
19
21
23
25
s2 = & s [ cont ];
comprime ( s2 , cs ) ;
27
}
29
8 / 26
11
if ( argc != 3) {
printf ( " Uso : comp - decomp [ - c | - d ] cadena \ n " ) ;
return 1;
} else {
if ( ( strcmp ( argv [1] , " -c " ) != 0) && ( strcmp ( argv [1] , " -d " ) != 0) ) {
printf ( " Uso : comp - decomp [ - c | - d ] cadena \ n " ) ;
return 2;
}
}
if ( strcmp ( argv [1] , " -c " ) == 0) {
c [0] = \0 ;
comprime ( argv [2] , c ) ;
printf ( " Compresion de \" %s\"( %d ) es \" %s\"( %d ) \ n " , argv [2] , strlen ( argv [2]) , c ,
strlen ( c ) ) ;
}
if ( strcmp ( argv [1] , " -d " ) == 0) {
c [0] = \0 ;
descomprime ( argv [2] , c ) ;
printf ( " Descompresion de \" %s\"( %d ) es \" %s\"( %d ) \ n " , argv [2] , strlen ( argv [2]) ,
c , strlen ( c ) ) ;
}
return 0;
13
15
17
19
21
23
25
27
29
31
9 / 26
necesitamos dividir el c
odigo anterior.
Colocaremos en uno o varios archivos las funciones y/o estructuras de
compresi
on.
decomp.h y decomp.c Contienen el c
odigo relacionado con la funcion
de descompresi
on.
comp-decomp-driver.c Es el programa principal en el cual se
comp.h y comp.c I
/* comp . h */
/* comp . c */
5
7
9
11
if ( s == NULL ) return 0;
l = strlen ( s ) ;
if ( l < 2) return l ;
else {
int i = 1;
while ( s [0] == s [ i ++]) cont ++;
return cont ;
}
13
15
17
19
11 / 26
comp.h y comp.c II
1
/* comp . c */
5
7
if ( s == NULL ) return ;
l = strlen ( s ) ;
if ( l < 3) strcat ( cs , s ) ;
else {
int csl = 0;
cont = c a r a c t e r e s _ i g u a l e s ( s ) ;
if ( cont > 2) {
sprintf ( num , " %d " , cont ) ;
11
13
15
17
strcat ( cs , num ) ;
csl = strlen ( cs ) ;
cs [ csl ++] = s [0];
cs [ csl ] = \0 ;
} else {
csl = strlen ( cs ) ;
for ( i = 0; i < cont ; i ++) cs [ csl ++] = s [0];
cs [ csl ] = \0 ;
}
s2 = & s [ cont ];
comprime ( s2 , cs ) ;
19
21
23
25
27
}
29
12 / 26
decomp.h y decomp.c
/* decomp . h */
/* decomp . c */
7
9
13 / 26
comp-decomp-driver.c
1
3
5
7
9
11
13
if ( argc != 3) {
printf ( " Uso : comp - decomp [ - c | - d ] cadena \ n " ) ;
return 1;
} else
if ( ( strcmp ( argv [1] , " -c " ) != 0) &&
( strcmp ( argv [1] , " -d " ) != 0) )
{
printf ( " Uso : comp - decomp [ - c | - d ] cadena \ n " ) ;
return 2;
}
if ( strcmp ( argv [1] , " -c " ) == 0) {
c [0] = \0 ;
comprime ( argv [2] , c ) ;
printf ( " Compresion de \" %s\"( %d ) es \" %s\"( %d ) \ n " , argv [2] , strlen ( argv [2]) , c ,
strlen ( c ) ) ;
}
if ( strcmp ( argv [1] , " -d " ) == 0) {
c [0] = \0 ;
descomprime ( argv [2] , c ) ;
printf ( " Descompresion de \" %s\"( %d ) es \" %s\"( %d ) \ n " , argv [2] , strlen ( argv [2]) ,
c , strlen ( c ) ) ;
}
return 0;
15
17
19
21
23
25
27
29
31
33
}
14 / 26
obtenemos su .o.
Con la aplicaci
on ar -similar a tar- creamos el archivo biblioteca
llamamos:
c Crea el archivo con nombre: libcomp-decomp.a
r Reemplaza -si ya existiera- en el archivo .a cada uno
de los archivos que se especifican a continuacion.
s Crea un ndice en el archivo .a para que sea mas
rapido acceder a los archivos que contiene.
15 / 26
/ruta/hasta/fichero.a.
Adicionalmente, si su nombre sigue este convenio: libnombre-bib.a, el
16 / 26
2
4
# ######################
# Biblioteca estatica #
# #######################################################
comp - decomp - estatico : comp - decomp - driver . o libcomp - decomp . a
$ ( CC ) - static comp - decomp - driver . o -L . - lcomp - decomp -o comp - decomp - estatico
6
8
10
12
14
16
comp . o : comp . c
$ ( CC ) -c $ ( CFLAGS ) comp . c
decomp . o : decomp . c
$ ( CC ) -c $ ( CFLAGS ) decomp . c
17 / 26
18 / 26
1
3
5
7
# #################################
# Bibliotecea de enlace dinamico #
# ################################################################
comp - decomp - dinamico : comp - decomp - driverdin . o libcomp - decomp . so
$ ( CC ) comp - decomp - driverdin . o -L . - lcomp - decomp -o comp - decomp - dinamico
comp - decomp - driverdin . o : comp - decomp - driverdin . c
$ ( CC ) - fpic -c $ ( CFLAGS ) comp - decomp - driverdin . c
9
11
13
15
17
19 / 26
20 / 26
comp . o :
0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 t c a r a c t e r e s _ i g u a l e s
0 0 0 0 0 0 0 0 0 0 0 0 0 0 78 T comprime
U sprintf
U strcat
U strlen
5
7
9
11
decomp . o :
0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 T descomprime
U strcat
21 / 26
Release de VisualStudio?
22 / 26
l d d compdecomp
l i n u x v d s o . s o . 1 => ( 0 x 0 0 0 0 7 f f f a 5 7 f f 0 0 0 )
l i b c . s o . 6 => / l i b / x 8 6 6 4l i n u x gnu / l i b c . s o . 6 ( 0 x 0 0 0 0 7 f 3 8 c 1 b 4 6 0 0 0 )
l i b c o m pdecomp . s o => n o t f o u n d
/ l i b 6 4 / l dl i n u x x86 64. s o . 2 ( 0 x 0 0 0 0 7 f 3 8 c 1 e f 6 0 0 0 )
23 / 26
Separamos el c
odigo siguiendo los mismos criterios que en el ejemplo
en C.
Para generar la biblioteca empleamos una orden como esta:
valac --library=comp-decomp -H comp-decomp.h comp.vala -X -fPIC -X -shared -o libcomp-decomp.so
Mientras que para enlazar con ella usaremos una orden como esta
otra:
valac comp-decomp.vapi comp-decomp-driver.vala -X libcomp-decomp.so -X -I. -o comp-decomp-driver
24 / 26
/* comp . vala */
namespace CompDecomp {
private int c a r a c t e r e s _ i g u a l e s ( string s ) {
int l = 0;
int cont = 1;
l = s . length ;
if ( l < 2) return l ;
else {
int i = 1;
while ( s [0] == s [ i ++]) cont ++;
return cont ;
}
9
11
13
}
15
public void comprime ( string s , ref string cs ) {
int l = 0 , cont = 0;
string num , s2 ;
17
19
l = s . length ;
if ( l < 3) cs += s ;
else {
cont = c a r a c t e r e s _ i g u a l e s ( s ) ;
if ( cont > 2) {
num = cont . to_string () ;
cs += num ; cs += s [0]. to_string () ;
} else { cs += string . nfill ( cont , s [0]) ; }
s2 = s [ cont : s . length ];
comprime ( s2 , ref cs ) ;
}
21
23
25
27
29
31
}
}
25 / 26
2
4
6
8
10
12
14
16
18
20
return 0;
}
26 / 26