Phân biệt Static Libraries và Shared Libaries trong C/C++

Thư viện trong C/C++ được chia làm 2 loại là Static LibrariesShared Libraries (hay Dynamic Libraries).


Static Libraries

Static Libraries còn gọi là thư viện liên kết tĩnh. Mỗi thư viện liên kết tĩnh là một file chứa các object được build từ source code, các file objects này chứa các define của functions, variables. Những file Static Libraries có thể được linked với các file objects khác để tạo thành 1 file thư viện khác hoặc 1 file executable.

  • Với GCC (compiler cho Linux), MinGW (GCC cho môi trường Windows) thì static lib sẽ có tên dạng lib***.a
  • Với MSVC (compiler của Visual Studio cho Windows) thì static lib sẽ có tên dạng ***.lib
  • Static lib thường được cung cấp dưới dạng các file thư viện đã được build sẵn (.a, .lib) cùng với các file headers tương ứng. Các application sử dụng thư viện phải include header files và link tới các file thư viện. Với open source thì thường có thêm option là download source về tự build thành static lib và sử dụng
  • Khi sử dụng static lib, nếu lib có sự thay đổi và muốn application/library đang sử dụng lib đó cập nhật đc sự thay đổi thì bắt buộc phải build lại application/library 

Shared Libraries (hay Dynamic Libraries)

Shared Libraries còn gọi là thư viện liên kết động. Nó là file chứa các objects được build từ source code, các file objects này chứa các define của functions, variables. Những file Shared Libraries được load vào file executable của application lúc runtime. Vì nhiều chương trình có thể sử dụng chung các thư viện này nên nó được gọi là Shared Libraries.

  • Shared Libraries có thể được load ngay lúc bắt đầu chạy chương trình (gọi là implicit linking) hoặc load/unload khi cần thiết (gọi là explicit linking). Nếu muốn hiểu sâu thêm thì anh em tham khảo link sau https://msdn.microsoft.com/en-us/library/9yd93633.aspx
  • Với GCC (compiler cho Linux), MinGW (GCC cho môi trường Windows) thì shared lib sẽ có tên dạng lib***.so và đi kèm là file lib***.dll.a (file này chứa thông tin về file lib***.so, khi build thì application phải link với file này thì khi chạy application mới biết cần load file lib***.so nào vào)
  • Với MSVC (compiler của Visual Studio cho Windows) thì shared lib sẽ có name ***.dll và đi kèm là file ***.lib (tác dụng của file này tương tự file lib***.dll.a đã nói ở trên)
  • Shared lib thường được cung cấp dưới dạng các file thư viện đã được build sẵn (.dll.a đi kèm .so, hoặc .lib đi kèm .dll) + các file headers tương ứng. Các application sử dụng thư viện phải include header files và khi build thì phải link tới các file .dll.a hoặc .lib. Khi chạy thì file executable (application) phải load các file .so hoặc .dll tương ứng vào. File executable (application) sẽ search các file shared lib trong chính folder chứa nó và 1 số folder mặc định khác (Trên windows là C:\Windows\System32 còn trên Linux là folder được chỉ định thông qua LD_LIBRARY_PATH). Với open source thì thường có thêm option là download source về tự build thành shared lib và sử dụng
  • Khi sử dụng shared lib, nếu lib có sự thay đổi thì có 2 trường hợp

Trường hợp 1: Chỉ thay đổi implement của các function (change file source), không change header

→ application đang sử dụng lib muốn cập nhật đc sự thay đổi thì chỉ cần copy lại các file .so hoặc .dll

Trường hợp 2: Thay đổi file header → Phải build lại application (link với file .dll.a hoặc .lib mới), copy lại file .so hoặc .dll


Ưu nhược điểm của từng loại thì các bạn tham khảo thêm link http://www.wincodebits.in/2015/06/static-libraries-vs-dynamic-libraries-advantages-and-disadvantages.html?494706  

— Phạm Minh Tuấn (Shun) —