Tạo và sử dụng thư viện liên kết tĩnh trong C++
Chào các bạn đang theo dõi khóa học lập trình trực tuyến ngôn ngữ C++.
Thư viện (library) là một tập mã nguồn đã được đóng gói, có thể được tái sử dụng trong nhiều chương trình khác nhau.
Thư viện trong ngôn ngữ C++ gồm 2 thành phần chính:
- Những header files khai báo các hàm có thể được sử dụng trong chương trình.
- Tập hợp mã nguồn đã được biên dịch thành mã máy tương ứng với phần định nghĩa của các hàm đã được khai báo trong các header files.
Nhiều thư viện khi cung cấp đã được biên dịch sẵn vì nhiều lý do. Thông thường, hiếm khi có sử chỉnh sửa trong phần thư viện, nên không cần phải biên dịch nhiều lần. Thư viện cũng được biên dịch sẵn thành mã máy để tránh người dùng truy cập và chỉnh sửa.
Có 2 kiểu thư viện: thư viện liên kết tĩnh (static library) và thư viện liên kết động (dynamic library).
Trong bài học này, chúng ta sẽ tìm hiểu xem thư viện liên kết tĩnh là gì? Cách sử dụng như thế nào? Và cùng thử tạo ra một thư viện liên kết tĩnh cho riêng mình.
Thư viện liên kết tĩnh (static library)
Thư viện liên kết tĩnh là một tập hợp những thủ tục, những chương trình con đã được biên dịch và liên kết trực tiếp đến chương trình của các bạn. Khi các bạn biên dịch một chương trình có sử dụng thư viện liên kết tĩnh, tất cả những hàm trong thư viện đó trở thành một phần trong chương trình thực thi. Trên hệ điều hành Windows, các bạn sẽ thấy thư viện liên kết tĩnh có phần mở rộng .lib, và trên hệ điều hành Linux sẽ có phần mở rộng .a.
Ưu điểm của thư viện liên kết tĩnh là khi bạn phân phối chương trình đến người dùng, bạn chỉ cần gửi phần chương trình thực thi, vì phần thư viện đã gắn liền với chương trình thực thi rồi. Điều này cũng đảm bảo thư viện sử dụng luôn tương thích với chương trình.
Nhược điểm của thư viện liên kết tĩnh là mỗi lần có cập nhật mới, các bạn phải biên dịch lại toàn bộ thư viện. Kiểu thư viện này cũng gây tốn kém tài nguyên bộ nhớ khi toàn bộ thư viện phải được gắn liền với chương trình thực thi.
Bây giờ, chúng ta cùng nhau làm từng bước để tạo ra một thư viện liên kết tĩnh đơn giản.
Tạo một dự án để xây dựng thư viện liên kết tĩnh
Chúng ta cùng tạo một Project mới bằng cách chọn File -> New -> Project:
Tại đây, với Visual Studio 2015/2017, mình chọn kiểu Project là Static Library, đặt tên là MathStaticLib. Thư viện này sẽ chứa một số hàm toán học đơn giản.
Sau khi nhấn OK, Visual Studio IDE sẽ tạo ra một dự án mới với cấu trúc như bên dưới. Lúc này, các bạn chưa cần quan tâm đến chúng làm gì.
Sau khi build thử dự án này, kết quả biên dịch sẽ được tổng hợp lại bên trong 1 file có tên là MathStaticLib.lib như bên dưới:
Vì mình đang để ở chế độ build Debug, nên file thư viện này sẽ nằm trong thư mục Debug, và tương thích với các dự án khác ở trong chế độ build Debug.
Sau này, các bạn cũng nên build thêm một bản Release, bản này sẽ dùng để phân phối đến những lập trình viên khác sử dụng để Release sản phẩm của họ.
Đến đây, coi như chúng ta đã thành công trong bước đầu tạo một thư viện liên kết tĩnh. Nếu có trục trặc gì xảy ra, các bạn nên xem lại trước khi đến với phần tiếp theo.
Tạo phần header file cho thư viện
Bây giờ, chúng ta cùng tạo một header file đơn giản chứa đựng các khai báo chức năng có trong thư viện:
Các bạn thêm file này vào thư viện như cách thêm một header file vào một chương trình.
Xây dựng phần định nghĩa cho các chức năng trong thư viện
Tiếp theo là thêm phần định nghĩa cho mỗi chức năng đã khai báo:
Đến đây, nếu các bạn không include “stdafx.h” vào thì compiler sẽ báo lỗi. Đây là file mà Micrsoft Visual Studio sử dụng để báo cho compiler biết những file đã từng được biên dịch một lần và không cần biên dịch lại (theo mình biết đơn giản là vậy, các bạn mới bắt đầu cũng không cần quan tâm lắm đến file này, nếu thấy compiler báo lỗi thiếu file đó thì cứ include vào thôi).
Sử dụng thư viện liên kết tĩnh trong chương trình của bạn
Lúc này, các bạn thử biên dịch thư viện lại một lần nữa:
Nếu kết quả tương tự như trên nghĩa là các bạn đã có một bộ thư viện liên kết tĩnh Math đơn giản cho riêng mình rồi.
Điều chúng ta cần quan tâm bây giờ là làm sao để sử dụng thư viện này trong dự án hoặc chương trình khác.
Mình sẽ hướng dẫn các bạn một cách đơn giản mà Visual Studio 2015/2017 có hỗ trợ. Nhưng trước hết, mình mở lại dự án mẫu mình đã sử dụng trong các bài học trước:
Mình đã clean sạch sẽ, và chỉ để lại một file main.cpp để dùng thử thư viện mình vừa tạo ra.
Bây giờ, chúng ta cần vào phần thuộc tính (Properties) của dự án hiện tại để cấu hình một số thứ trước khi sử dụng thư viện liên kết tĩnh. Nhưng để thuận tiện hơn, chúng ta cùng tạo một thư mục include và thư mục lib trong thư mục chứa project hiện hành.
Thư mục include sẽ chứa các header files của thư viện. Trong thư viện MathStaticLib, chúng ta chỉ có tạo ra một header file duy nhất, nên chỉ cần copy file đó vào trong thư mục include vừa tạo ra của chương trình của các bạn:
Và thư mục lib sẽ chứa phần mã nguồn thư viện đã biên dịch thành gói .lib:
Bây giờ, chúng ta cùng vào thực hiện một số cấu hình đơn giản để sử dụng. Các bạn click chuột phải vào dự án, chọn Properties -> C/C++ -> General:
Đây sẽ là nơi các bạn trỏ đường dẫn đến thư mục chứa các header files của thư viện liên kết tĩnh vừa tạo:
Như mình đã nói ở trên, các file header đã được copy vào trong thư mục include. Kí tự “./” đại diện cho thư mục hiện hành của dự án.
Bước tiếp theo, chúng ta cần cấu hình cho chương trình hiện tại trỏ đến thư mục chứa các file .lib trong thư mục lib. Từ cửa sổ Properties, các bạn chọn thẻ Linker -> General, rồi tìm đến dòng Additional Library Directories:
Chỉ còn một bước nữa là xong phần cấu hình rồi các bạn.
Cũng trong cửa sổ Properties, các bạn chọn thẻ Linker -> Input, tìm đến dòng Additional Dependencies:
Trong phần này, các bạn điền vào tên các thư viện cần dùng trong chương trình kèm theo phần đuôi mở rộng nha.
Chạy chương trình
Giờ thì chúng ta đã có thể gọi đến các hàm đã được định nghĩa trong thư viện:
#include <iostream>
#include "MathStaticLib.h"
int main()
{
std::cout << Math::Add(2, 5) << std::endl;
std::cout << Math::Sub(2, 5) << std::endl;
std::cout << Math::Mul(2, 5) << std::endl;
std::cout << Math::Div(2, 5) << std::endl;
system("pause");
return 0;
}
Một điểm đặc biệt là sau khi build chương trình xong, các bạn có thể copy file thực thi .exe ra bất kỳ thư mục nào khác nhưng vẫn có thể chạy được, vì phần thư viện đã được liên kết cứng vào bên trong chương trình.
Hẹn gặp lại các bạn trong bài học tiếp theo trong khóa học lập trình C++ hướng thực hành.
Mọi ý kiến đóng góp hoặc thắc mắc có thể đặt câu hỏi trực tiếp tại diễn đàn.
www.daynhauhoc.com