Hệ thống plugin tôi biết tất cả sử dụng thư viện động. Về cơ bản, bạn cần xác định một cái bắt tay nhỏ, hiệu quả giữa kernel hệ thống và các plugin. Vì không có C++ ABI, các plugin phải chỉ sử dụng một API C hoặc sử dụng trình biên dịch rất giống nhau (và có thể là phiên bản trình biên dịch) làm hạt nhân của hệ thống. Giao thức đơn giản nhất có thể là một hàm, tất cả các nhà phát triển plugin sẽ phải cung cấp, nó trả về một cá thể của một lớp có nguồn gốc từ lớp cơ sở của bạn, được trả về như một con trỏ lớp cơ sở. (Các extern "C"
đảm bảo rằng chức năng sẽ không có một cái tên đọc sai, và do đó dễ dàng hơn để tìm theo tên của nó.) Một cái gì đó như:
extern "C" {
plugin_base* get_plugin();
}
Các hạt nhân sau đó sẽ cố gắng để tải tập tin nhị phân tìm thấy ở những nơi được chỉ định là năng động thư viện và cố gắng tìm hàm get_plugin()
. Nếu nó thành công, nó sẽ gọi hàm này và kết thúc bằng một thể hiện plugin được nạp.
Tất nhiên, sẽ tốt hơn nếu bạn có chức năng kiểm tra phiên bản của API mà plugin được biên dịch so với phiên bản của hạt nhân. (Bạn có thể thay đổi lớp cơ sở đó, sau khi tất cả.) Và bạn có thể có các hàm khác, trả về thông tin về các plugin (hoặc bạn có này như là các virtual trong lớp cơ sở). Điều đó phụ thuộc rất nhiều vào bản chất của hệ thống của bạn.
Nếu plugin_base không phải là POD nhưng đó là lớp thừa hưởng từ lớp plugin cơ sở, tôi nghĩ rằng toàn bộ việc cần làm một số loại C++ ABI (trình biên dịch bạn đã sử dụng) sẽ phải được sử dụng.: S –
@Matteo: Vâng, bạn đã có một điểm rất hợp lệ ở đó. Cảm ơn. Tôi đã thích nghi câu trả lời của tôi cho phù hợp. – sbi
Không sao cả. :) BTW, một thay thế trên Windows sẽ được sử dụng COM, mà thực sự có thể được nhìn thấy một phần như một C + + ABI tương thích với các ngôn ngữ khác. –