Bài viết hỗ trợ tài liệu cho chương trình đào tạo lập trình web back-end với Spring/Hibernate cho doanh nghiệp của STDIO Training.
Quý doanh nghiệp vui lòng liên hệ tại đây.
STDIO Giai đoạn liên kết Linking trong quá trình thực thi một chương trình C/C++ là giai đoạn mà Linker sẽ nhúng, kết hợp các file mã nhị phân file .obj được biên dịch và các thư viện bên ngoài như thư viện liên kết tĩnh (.lib), thư viện liên kết động (.dll). Bài viết này sẽ phân tích về những thư viện đó cũng như cách tạo ra các thư viện đó trong C++ như thế nào.
Nội dung bài viết

Giới thiệu

Giai đoạn liên kết Linking trong quá trình thực thi một chương trình C/C++ là giai đoạn mà Linker sẽ nhúng, kết hợp các file mã nhị phân file .obj được biên dịch và các thư viện bên ngoài như thư viện liên kết tĩnh (.lib), thư viện liên kết động (.lib và .dll). Bài viết này sẽ phân tích về những thư viện đó cũng như cách tạo ra các thư viện đó trong C++ như thế nào.

Tiền đề bài viết

Với nhiều project, tôi phải sử dụng nhiều đoạn mã nguồn giống nhau trong những project khác nhau. Vấn đề đặt ra là có cách giải quyết nào hay không thay vì copy và paste mã nguồn? Khi đó, thư viện liên kết động hay thư viện liên kết tĩnh chính là giải pháp tốt nhất. Nó còn giúp tôi giải quyết được vấn đề thời gian biên dịch quá lâu do thường các project tôi làm rất nhiều file.

Đối tượng hướng đến

Những lập trình viên đang tìm hiểu về thư viện liên kết tĩnh (Static Link Libraries) và thư viện liên kết động (Dynamic Link Libraries).

Thư viện liên kết tĩnh

Thư viện liên kết tĩnh có phần mở rộng là .lib. File này chứa mã nhị phân của mã nguồn sau khi được build.

Tạo thư viện liên kết tĩnh

Mở Visual Studio 2013 để tạo một Empty Project bằng cách vào File > New > Project, sau đó chọn Empty Project, đặt tên và nhấn OK để tạo Project. 

ss_1

Tạo 1 thư viện toán học gồm 2 file, StdioMath.h chứa prototype gồm các hàm toán học cơ bản Add, Sub, Mul, Div và StdioMath.cpp chứa mã nguồn định nghĩa.

File StidoMath.h

int Add(int, int);
int Sub(int, int);
int Mul(int, int);
int Div(int, int);

Và file StdioMath.cpp

#include "StdioMath.h"
int Add(int a, int b)
{
	return a + b;
}

int Sub(int a, int b)
{
	return  a - b;
}

int Mul(int a, int b)
{
	return a * b;
}

int Div(int a, int b)
{
	return a / b;
}

Mở cửa sổ Properties bằng cách chuột phải vào tên project và chọn Properties. Mục Configuration Properties/General chọn Configuration Type, sau đó chọn kiểu ứng dụng mà chúng ta muốn build. Ở đây ta sẽ chọn là Static library (.lib).

ss_2

Build Project để thấy kết quả.

ss_3

Vào thư mục Debug chúng ta sẽ thấy file StaticLib.lib được tạo ra sau khi build project.

Thư viện liên kết động

Thư viện liên kết động gồm có 2 file:

  • File .lib chứa các thông tin cần thiết để hệ điều hành nạp thư viện dll và xác định các hàm export trong dll.
  • File .dll chứa chứa mã nhị phân của mã nguồn.

Tạo thư viện liên kết động

Tương tự như tạo thư viện liên kết tĩnh tôi tạo một project khác có tên là DynamicLib. Project này cũng có hai file là StdioMath.hStdioMath.cpp được viết như sau:

File StdioMath.h

int Add(int, int);
int Sub(int, int);
int Mul(int, int);
int Div(int, int);

File StdioMath.cpp

#include "StdioMath.h"

int Add(int a, int b)
{
	return a + b;
}

int Sub(int a, int b)
{
	return  a - b;
}

int Mul(int a, int b)
{
	return a * b;
}

int Div(int a, int b)
{
	return a / b;
}

Configuration Type chọn Dynamic Library (.dll). Sau đó build project để thấy kết quả.

ss_4

Mở thư mục Debug sẽ thấy hai file DynamicLib.libDynamicLib.dll

Sử dụng thư viện liên kết

Sử dụng thư viện liên kết tĩnh

Tạo một project khác với tên là TestStaticLib. Copy 2 File StdioMath.h và thư viện StaticLib.lib được build ở project StaticLib vào project TestStaticLib.

Chỉ thị cho trình biên dịch là chúng ta cần link tới file StaticLib.lib bằng cách mở hộp thoại Properties.  Mục Configuration Properties/Input chọn Additional Dependences và gõ vào như sau:

ss_5

Hoặc có thể sử dụng chỉ thị ở đầu file chương trình.

#pragma comment(lib, "StaticLib.lib")

Sử dụng thư viện bằng cách include StidoMath.h và dùng như những hàm thông thường khác.

#include "StdioMath.h"

int main()
{
	int a = Add(5, 7);
	int b = Sub(7, 8);
	int c = Mul(7, 8);
	int d = Div(7, 5);
	return 0;
}

Sử dụng thư viện liên kết động

Tạo một project khác với tên là TestDynamicLib. Copy 2 File StdioMath.h và thư viện StaticLib.lib được build ở project  DynamicLib vào project TestDynamicLib.

Chỉ thị cho trình biên dịch là chúng ta cần link tới file DynamicLib.lib bằng cách mở hộp thoại Properties. Mục Configuration Properties/Input chọn Additional Dependences và gõ vào như sau:

ss_6

Hoặc có thể sử dụng chỉ thị ở đầu file chương trình.

#pragma comment(lib, "StaticLib.lib")

Sử dụng thư viện tương tự đối với thư viện liên kết tĩnh.

#include "StdioMath.h"

int main()
{
	int a = Add(5, 7);
	int b = Sub(7, 8);
	int c = Mul(7, 8);
	int d = Div(7, 5);
	return 0;
}

Build và chạy chương trình. Nếu trong quá trình chạy xảy ra lỗi thiếu dll, ta copy file DynamicLib.dll build từ project DynamicLib sang thư mục debug của solution.

ss_7

Download Demo

STDIO_Lib_VS2013.zip

 

THẢO LUẬN
ĐÓNG