Home | Download | Documentation | Programming | FAQ | About Me
How to create your own library ?

First of all, what's library - in real world,library is collection of books.In computer terms,library has collection of functions. For example,printf() is a library function.That means,this printf functions definition is available in gcc libraries - libc.
Let's create a new directory called c-lib,

[lg@giis.co.in ~]$ mkdir c-lib
[lg@giis.co.in ~]$ cd c-lib/

create a new file called "hi.c" with a function named fun1.

[lg@giis.co.in c-lib]$ cat > hi.c
void fun1(){                    
printf("\n Fun1");              
}                               
^C   #press ctrl+C to signal end of input from keyboard.   
now create a new file called "hi2.c" with a function named fun2.

[lg@giis.co.in c-lib]$ cat > hi2.c
void fun2(){                     
printf("\n Fun2");               
}                                
^C  #press ctrl+C to signal end of input from keyboard.

So here is the two files we have created.

                             
[lg@giis.co.in c-lib]$ cat  hi.c
void fun1(){                   
printf("\n Fun1");             
}                              
[lg@giis.co.in c-lib]$ cat  hi2.c
void fun2(){                    
printf("\n Fun2");              
}

Now create a header file called lib.h

                              
[lg@giis.co.in c-lib]$ cat > lib.h
void fun1();                     
void fun2();                     

Now are going to use above two functions fun1 and fun2 in final C program named hi_main.c

[lg@giis.co.in c-lib]$ cat > hi_main.c
#include "lib.h"                     
main(){                              
fun1();                              
fun2();                              
}                                    
^C                                   
You can see both functions are called inside main(). Now compile the c program to create intermediate object file named hi_main.o
[lg@giis.co.in c-lib]$ gcc  -c hi_main.c 
[lg@giis.co.in c-lib]$ ls -l             
total 20                                
-rw-r--r-- 1 lg lg  34 2009-07-16 10:49 hi2.c
-rw-r--r-- 1 lg lg  34 2009-07-16 10:49 hi.c 
-rw-r--r-- 1 lg lg  43 2009-07-16 10:50 hi_main.c
-rw-r--r-- 1 lg lg 784 2009-07-16 10:51 hi_main.o
-rw-r--r-- 1 lg lg  26 2009-07-16 10:50 lib.h    

Now compile our function files to create .o files.

[lg@giis.co.in c-lib]$ gcc -c hi.c hi2.c
hi.c: In function ‚??fun1‚??:              
hi.c:2: warning: incompatible implicit declaration of built-in function ‚??printf‚??
hi2.c: In function ‚??fun2‚??:                                                      
hi2.c:2: warning: incompatible implicit declaration of built-in function ‚??printf‚??
[lg@giis.co.in c-lib]$ ls -l                                                      
total 28                                                                         
-rw-r--r-- 1 lg lg  34 2009-07-16 10:49 hi2.c                                    
-rw-r--r-- 1 lg lg 816 2009-07-16 10:51 hi2.o                                    
-rw-r--r-- 1 lg lg  34 2009-07-16 10:49 hi.c                                     
-rw-r--r-- 1 lg lg  43 2009-07-16 10:50 hi_main.c                                
-rw-r--r-- 1 lg lg 784 2009-07-16 10:51 hi_main.o                                
-rw-r--r-- 1 lg lg 816 2009-07-16 10:51 hi.o                                     
-rw-r--r-- 1 lg lg  26 2009-07-16 10:50 lib.h                                    
As you can see two new files hi.o and hi2.o are created. We finally create an executable binary using these three object files.
[lg@giis.co.in c-lib]$ gcc -o hello hi_main.o hi.o hi2.o
[lg@giis.co.in c-lib]$ ls -l                            
total 36                                               
-rwxr-xr-x 1 lg lg 6482 2009-07-16 10:51 hello*        
-rw-r--r-- 1 lg lg   34 2009-07-16 10:49 hi2.c         
-rw-r--r-- 1 lg lg  816 2009-07-16 10:51 hi2.o         
-rw-r--r-- 1 lg lg   34 2009-07-16 10:49 hi.c          
-rw-r--r-- 1 lg lg   43 2009-07-16 10:50 hi_main.c     
-rw-r--r-- 1 lg lg  784 2009-07-16 10:51 hi_main.o     
-rw-r--r-- 1 lg lg  816 2009-07-16 10:51 hi.o          
-rw-r--r-- 1 lg lg   26 2009-07-16 10:50 lib.h         

time to run the binary.

[lg@giis.co.in c-lib]$ ./hello                          

 Fun1
 Fun2
Yeah,we got the desired output :) You can use nm command to view list of functions on a specific object file.
[lg@giis.co.in c-lib]$ nm hi.o
00000000 T fun1              
         U printf      

got it ? hi.o has function called fun1. "U" refers those functions are  unresolved.      
[lg@giis.co.in c-lib]$ nm hi2.o
00000000 T fun2               
         U printf             
[lg@giis.co.in c-lib]$ nm hi_main.o
         U fun1                   
         U fun2                   
00000000 T main                   
[lg@giis.co.in c-lib]$ nm hello 
080494a8 d _DYNAMIC            
08049574 d _GLOBAL_OFFSET_TABLE_
0804847c R _IO_stdin_used       
         w _Jv_RegisterClasses  
08049498 d __CTOR_END__         
08049494 d __CTOR_LIST__        
080494a0 D __DTOR_END__         
0804949c d __DTOR_LIST__        
08048490 r __FRAME_END__        
080494a4 d __JCR_END__          
080494a4 d __JCR_LIST__         
08049594 A __bss_start          
0804958c D __data_start         
08048430 t __do_global_ctors_aux
080482f0 t __do_global_dtors_aux
08049590 D __dso_handle         
         w __gmon_start__       
0804842a T __i686.get_pc_thunk.bx
08049494 d __init_array_end      
08049494 d __init_array_start    
080483c0 T __libc_csu_fini       
080483d0 T __libc_csu_init       
         U __libc_start_main@@GLIBC_2.0
08049594 A _edata                      
0804959c A _end                        
0804845c T _fini                       
08048478 R _fp_hw                      
08048250 T _init                       
080482c0 T _start                      
08049594 b completed.6610              
0804958c W data_start                  
08049598 b dtor_idx.6612               
08048350 t frame_dummy                 
08048398 T fun1                        
080483ac T fun2                        
08048374 T main                        
         U printf@@GLIBC_2.0           
Now we could use ar command archive our object files (hi.o and hi2.o) into a library file named libhi.a
[lg@giis.co.in c-lib]$ ar crv libhi.a hi.o hi2.o
a - hi.o                                       
a - hi2.o

here is the list of files :

[lg@giis.co.in c-lib]$ ls -ltr
total 40
-rw-r--r-- 1 lg lg   34 2009-07-16 10:49 hi.c
-rw-r--r-- 1 lg lg   34 2009-07-16 10:49 hi2.c
-rw-r--r-- 1 lg lg   26 2009-07-16 10:50 lib.h
-rw-r--r-- 1 lg lg   43 2009-07-16 10:50 hi_main.c
-rw-r--r-- 1 lg lg  784 2009-07-16 10:51 hi_main.o
-rw-r--r-- 1 lg lg  816 2009-07-16 10:51 hi.o
-rw-r--r-- 1 lg lg  816 2009-07-16 10:51 hi2.o
-rwxr-xr-x 1 lg lg 6482 2009-07-16 10:51 hello*
-rw-r--r-- 1 lg lg 1842 2009-07-16 10:53 libhi.a
Now we use the -L option to mention our own library file,while creating binary file named hello1. -lhi is the short form for -libhi.
[lg@giis.co.in c-lib]$ gcc -o hello1 hi_main.o -L . -lhi
[lg@giis.co.in c-lib]$ ls -ltr
total 48
-rw-r--r-- 1 lg lg   34 2009-07-16 10:49 hi.c
-rw-r--r-- 1 lg lg   34 2009-07-16 10:49 hi2.c
-rw-r--r-- 1 lg lg   26 2009-07-16 10:50 lib.h
-rw-r--r-- 1 lg lg   43 2009-07-16 10:50 hi_main.c
-rw-r--r-- 1 lg lg  784 2009-07-16 10:51 hi_main.o
-rw-r--r-- 1 lg lg  816 2009-07-16 10:51 hi.o
-rw-r--r-- 1 lg lg  816 2009-07-16 10:51 hi2.o
-rwxr-xr-x 1 lg lg 6482 2009-07-16 10:51 hello*
-rw-r--r-- 1 lg lg 1842 2009-07-16 10:53 libhi.a
-rwxr-xr-x 1 lg lg 6482 2009-07-16 10:54 hello1*

you can see binary file is created successfully 

[lg@giis.co.in c-lib]$ ./hello1

 Fun1
 Fun2

Cool,we got the output too. So we have used our own library to create a binary file. 

Powered by
Open Source Programmers