Hướng dẫn tạo và sử dụng thư viện liên kết động (dynamic link library) trong c++

Trước khi bắt đầu với bài viết ngày hôm nay, nếu như bạn chưa xem bài Hướng dẫn tạo và sử dụng thư viện tĩnh (static library) trong c++, xin mời bạn xem lại để hiểu rõ hơn về thư viện, cũng như sự khác nhau giữa thư viện liên kết tĩnh và thư viện liên kết động. Và quan trọng là bạn nắm được các bước xây dựng thư viện liên kết tĩnh. Vì trong bài viết này tôi sẽ không nói chi tiết về các bước để xây dựng project. Hôm nay, tôi sẽ chia sẻ với các bạn cách để tạo và sử dụng thư viện liên kết động (dynamic library) trong cpp (c++).

1. Cách tạo thư viện liên kết động (dynamic link library) trong cpp (c++)

Bây giờ, tôi sẽ giả sử rằng bạn đã nắm được các bước để xây dựng và sử dụng thư viện liên kết tĩnh. Thực ra, cách tạo ra một project để xây dựng thư viện liên kết động cũng giống như cách để tạo ra thư viện liên kết tĩnh. Chỉ khác ở bước cấu hình. Cụ thể là ở bước thứ 2, thay vì chọn Configuration TypeStatic library (.lib) thì bạn chọn Dynamic Library (.dll).

Sau khi cài đặt như vậy xong, khi bạn build project, trong thư mục Debug sẽ có 2 tệp tin thư viện đó là .lib.dll. Đọc đến đây có thể bạn sẽ thắc mắc là tại sao vẫn có tệp tin .lib ở đây. Thực ra, tệp tin .lib ở đây sẽ khác với tệp tin .lib khi build ra thư viện liên kết tĩnh. Cụ thể như thế nào thì tôi sẽ nói ở phần sau. Còn bây giờ tôi sẽ tiếp tục nói tiếp về cách để tạo ra thư viện liên kết động.

Code tạo thư viện liên kết động trong cpp

Khác với thư viện liên kết tĩnh, đối với thư viện liên kết động, các bạn sẽ cần phải xử lý ở trong code. Giả sử tôi sẽ làm một thư viện chứa các kiểu sắp xếp cơ bản như sau:

#ifndef _SORT_H_
#define _SORT_H_

#ifdef _WINDLL
#define _SORT_DLL_API __declspec(dllexport) // For compiling to export
#else
#define _SORT_DLL_API __declspec(dllimport) // For using to import
#endif

template <class T>
class Sort
{
public:
_SORT_DLL_API static void Selection(T *a, int N);
_SORT_DLL_API static void Insertion(T *a, int N);
_SORT_DLL_API static void BinaryInsertion(T *a, int N);
_SORT_DLL_API static void InterChange(T *a, int N);
_SORT_DLL_API static void Bubble(T *a, int N);
_SORT_DLL_API static void Shake(T *a, int N);
_SORT_DLL_API static void Quick(T *a, int left, int right);
_SORT_DLL_API static void Merge(T *a, int left, int right);
_SORT_DLL_API static void Heap(T *a, int N);
};

#endif

Thành phần chữ đỏ phía trên là quan trọng và bạn cần phải chú ý đến. Trong đó, thành phần sau:

#ifdef _WINDLL
#define _SORT_DLL_API __declspec(dllexport) // For compiling to export
#else
#define _SORT_DLL_API __declspec(dllimport) // For using to import
#endif

dùng để chỉ ra rằng: với project hiện tại là project để xây dựng lên thư viện liên kết động (dynamic link library), ta sẽ export (xuất ra) các hàm mà có chứa tham số _SORT_DLL_API đứng đầu. Ngược lại, với project sử dụng thư viện liên kết động này, các hàm mà có tham số _SORT_DLL_API đứng đầu sẽ được import (nhập vào) để sử dụng. Tiếp theo, bạn có thể thấy là các hàm tôi đều đặt tham số _SORT_DLL_API ở đầu.

Cấu hình tạo thư viện liên kết động trong project Visual Studio

Một chú ý nữa là: ở đây tôi có sử dụng #ifdef _WINDLL. Vậy _WINDLL ở đâu ra? Bạn nhấn chuột phải vào project, chọn Properties. Cửa sổ hiện ra, trong Configuration Properties => C/C++ => Preprocessor, tại Preprocessor Definitions giá trị sẽ là _WINDLL

huong-dan-tao-va-su-dung-thu-vien-dong-dynamic-link-library-cpp-1-phamvanlam-com

 

Đó là đối với project tạo ra thư viện. Còn với project để sử dụng thư viện này thì giá trị đó sẽ là _MBCS.

huong-dan-tao-va-su-dung-thu-vien-dong-dynamic-link-library-cpp-2-phamvanlam-com

 

 

Các bạn có thể xem lại các giá trị này trước khi làm. Vì tôi không chắc rằng nó sẽ đúng với tất cả. Về cơ bản, đến đây là bạn đã có thể tạo ra thư viện liên kết động (dynamic link library) được rồi. Vậy sử dụng nó như thế nào, tôi sẽ chia sẻ với bạn ngay sau đây.

2. Cách sử dụng thư viện liết động (dynamic link library)

Trước tiên là cấu hình project. Một lần nữa tôi muốn nhắc lại rằng: nếu như bạn chưa xem bài Hướng dẫn tạo và sử dụng thư viện tĩnh (static library) trong c++, thì mời bạn xem lại trước khi đọc tiếp nhé. Bởi vì việc cấu hình cũng như viết code sẽ hoàn toàn giống với việc tạo thư viện liên kết tĩnh.

Điểm khác nhau ở đây là: tệp tin .lib lúc này sẽ chỉ dùng để compile (biên dịch) chương trình. Nếu các bạn nhấn chạy thì nó sẽ báo lỗi như sau:

huong-dan-tao-va-su-dung-thu-vien-dong-dynamic-link-library-cpp-4-phamvanlam-com

 

 

Để chạy được chương trình thì các bạn phải copy tệp tin .dll vào thư mục Debug/Release – tức là thư mục chứa tệp tin thực thi .exe. Vì đối với phương pháp này, các hàm trong thư viện sẽ được gọi khi chương trình được thực thi. Đây là điểm khác biệt giữa việc sử dụng thư viện liên kết động và thư viện liên kết tĩnh.

Để hiểu hơn về cách tạo và sử dụng thư viện liên kết động (dynamic link library), các bạn có thể tham khảo tại đây.

Hy vọng bài viết có thể giúp ích cho bạn. Rất mong nhận được sự phản hồi của bạn.
Xin trân thành cám ơn.
Phạm Văn Lâm.

1 bình luận

  1. LP Devs Post authorReply

    Trên đây là bài hướng dẫn tạo và sử dụng thư viện động dynamic link library trong cpp. Hướng dẫn được áp dụng trên hệ điều hành Windows. Đối với Linux thì cách thực hiện sẽ khác. Rất mong nhận được góp ý của các bạn.

    Trân trọng,
    Phạm Văn Lâm

Leave a Reply

Your email address will not be published. Required fields are marked *