Tôi đã triển khai "hệ thống trình cắm" rất cơ bản như một phần của thư viện tĩnh tĩnh. Mỗi "trình cắm" thực hiện hỗ trợ cho một định dạng hình ảnh cụ thể, ví dụ: GIF, JPEG, vv .. Hơn nữa, tôi có một Singleton (một lớp được gọi là PluginManager
) mà giữ một danh sách tất cả các plug-in có sẵn.Đăng ký đối tượng trong Thư viện tĩnh
Phần khó khăn là tôi muốn tắt/bật các trình cắm thêm bằng cách thêm hoặc xóa tệp nguồn của họ khỏi tệp dự án. Để đạt được điều này, mỗi trình cắm thêm tạo một biến toàn cầu (với các tên khác nhau) và đăng ký trình cắm thêm trong hàm tạo của lớp đó đến PluginManager
.
Something như thế này cho các định dạng JPEG ...
struct JPEGPlugin
{
// constructor will register plugin
JPEGPlugin()
{
PluginManager::Singleton().RegisterPlugin(this);
}
// plenty of other code
...
};
JPEGPlugin jpeg_instance; // instantiate in global scope
Tuy nhiên, trong khi điều này hoạt động hoàn hảo về mặt lý thuyết, nó không thành công khi liên kết thư viện tĩnh này sang mã khác để xây dựng một thực thi. Miễn là tệp thực thi này không truy cập vào các globals của plugin (như jpeg_instance
), trình liên kết không thấy kết nối (anh ta hoàn toàn bỏ qua các tác dụng phụ của hàm tạo) và không bao gồm mã trong tệp thực thi cuối cùng. Nói cách khác, trình cắm JPEG không có sẵn trong ứng dụng cuối cùng.
Tôi gặp sự cố vài lần trong những năm qua và tôi luôn tìm kiếm giải pháp cho mạng. Mỗi lần, tôi chỉ tìm thấy các trang về cơ bản nói rằng đó là một vấn đề đã biết và tôi phải sống với nó.
Nhưng có thể một người nào đó trên SO biết cách thực hiện điều này?
OK, tôi vừa nhận thấy chỉnh sửa của bạn - đó là một điểm quan trọng! :) –