Saturday, June 6, 2015


Thư viện là một phần rất quan trong đối với bất kỳ hệ điều hành nào, chúng là một tập hợp các function được viết sẵn để có thể tái sử dụng ở trong nhiều chương trình khác nhau. Trong Linux sử dụng một bộ thư viện C đồ sộ của GNU trên tầng ứng dụng gọi là glibc.


Trong Root File System lib được đưa vào các thư mục 
+ /lib
+ /usr/lib
+ /usr/local/lib

1. Phân loại
Static Libraries
+ Có đuôi mở rộng .a
+ Các function trong lib được đưa vào trực tiếp trong app source (gọi là linked) trong lúc compile source, vì thế khi chạy app có thể chạy độc lập mà không cần một liên kết nào đến lib nữa.

Shared Libraries
+ Có đuôi mở rộng là .so
+ Được chia nhỏ thành hai loại nữa là:
   - Dynamic linking
     Các function không được đưa trực tiếp vào app source mà chỉ là các tham chiếu, khi chạy app      thì cần có một môi trường liên kết đến lib để app có thể tìm kiếm và khởi chạy các function      đó trong lib theo thời gian.
   - Dynamic loading
     Lib được load/unload và linked trong lúc app chạy, khi compile không cần có sự có tham              chiếu/liên kết nào đến lib như static hay dynamic linking, có nghĩa nó hoạt động giống như          plug-in của các trình duyệt.
   

Phân loại



Nguyên lý hoạt động

So sánh với lib trên Windows

Item UNIX Windows
object module func.o FUNC.OBJ
static library lib.a LIB.LIB
shares library lib.so LIB.DLL
program program PROGRAM.EXE

2. Cách tạo ra thư viện
Giả sử có file source foo.c, yêu cầu đặt ra là hãy tạo static và shared libraries từ file source này.
Chúng ta tạo thêm header foo.h để include vào các file source khác khi cần sử dụng các function trong library mới tạo ra.

foo.h
 #ifndef foo_h__  
 #define foo_h__  
 extern void foo(void);  
 #endif // foo_h__  

foo.c
 #include <stdio.h>  
      
 void foo(void)  
 {  
   printf("Hello, I'm a shared library");  
 }  

main.c
 #include <stdio.h>  
 #include "foo.h"  
    
 int main(void)  
 {  
   foo();  
   return 0;  
 }  
   

Tạo thư viện tĩnh - Static Libraries
Create static library:
 gcc -c foo.c  
 ar crv libfoo.a foo.o  
 ranlib libfoo.a   

Compile program:
 gcc -o program main.c libfoo.a  
 OR  
 gcc -o program main.c -L./ -lfoo  

Chú ý: ở cách compile thứ 2:
+ -L<path to library directory> : đường dẫn đến thư mục chứa library, trong ví dụ này là ./ tương đương với thư mục hiện tại
+ -l<library name> : cách viết ngắn gọn, yêu cầu tên đầy đủ của library phải là libfoo thì mới viết tắt thành -lfoo được.

Execute:
 $ ./program   
 Hello, I'm a shared library  


Tạo thư viện chia sẻ - Shared Libraries
Create shared library:
 gcc -c -Wall -Werror -fpic foo.c # Compiling with Position Independent Code - PIC  
 gcc -shared -o libfoo.so foo.o   #Creating a shared library from an object file  

Compile program:
 gcc -Wall -o program main.c -L./ -lfoo #Linking with a shared library  

Execute:
 export LIBFOO_DIR=`pwd`  
 export LD_LIBRARY_PATH=LIBFOO_DIR:$LD_LIBRARY_PATH  
 ./program  
 Hello, I'm a shared library


Khác với chương trình được compile với static library không cần một liên kết nào đến lib khi chạy chương trình, với shared library thì chương trình khi chạy cần một liên kết đến nó thông qua biến môi trường LD_LIBRARY_PATH, nếu không sẽ bị lỗi không thể load thư viện

 ./program: error while loading shared libraries: libfoo.so: 
cannot open shared object file: No such file or directory  


Cách kiểm tra xem chương trình sử dụng các thư viện nào ta dùng lệnh ldd:
 $ ldd program   
      linux-vdso.so.1 => (0x00007fff1896e000)  
      libfoo.so (0x00007f6987025000)  
      libc.so.6 => /lib64/libc.so.6 (0x0000003829e00000)  
      /lib64/ld-linux-x86-64.so.2 (0x0000003829600000)  

Xem thêm tại
cprogramming.com
yolinux.com 

3. Thư viện opensource
Trong thế giới Linux thư viện opensource vô cùng phong phú, hầu hết các ứng dụng đều dùng opensource, ví dụ:
+ Giao diện: QT, DirectFB, ...
+ Multimedia: Gstreamer, Alsa, taglib, ...
+ Networking: Curl, transmission, ...
+ Image processing: OpenCV
+ Xử lý đồ họa 2D/3D: OpenGL
+ Xử lý font chữ: freetype

Các thư viện opensourrce này thường được cung cấp miễn phí dưới dạng source code, muốn sử dụng được bạn cần compile chúng.

Thư viện phụ thuộc:
Nhiều  khi để tạo ra một thư viện nào đó người ta phải sử dụng một hoặc nhiều thư viện khác đã có sẵn, mục đích để tái sử dụng những tính năng mà người khác đã làm thay vì tự mình viết lại, điều đó giúp tăng tốc và tăng hiệu quả quá trình làm thư viện, các thư viện đó người ta gọi là thư viện phụ thuộc.

Cross compile thư viện:
Vấn đề này sẽ được đề cập chi tiết tại một bài viết khác trong mục thực hành trên KIT nhúng FriendlyARM.


Leave a Reply

Subscribe to Posts | Subscribe to Comments

- Copyright © Lập trình hệ thống nhúng Linux . Powered by Luong Duy Ninh -