- Back to Home »
- Linux Basic »
- Library
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 |
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.