2009-04-24 25 views
11

Khi phát triển khung công tác dựa trên plugin C/C++ (= 2?) Với các đối tượng/thư viện động được chia sẻ cần hỗ trợ trao đổi trực tiếp các ví dụ nào sẽ hữu ích khi xem chi tiết triển khai?Mô hình tốt cho hệ thống dựa trên plugin C/C++?

Cảm ơn.

Lưu ý: sống trao đổi là vấn đề mấu chốt ở đây, không cần phải khởi động lại hệ thống là một yêu cầu

+0

Bạn có thể xây dựng trên hệ điều hành không? –

+0

Xem http://stackoverflow.com/questions/384121/creating-a-module-system-dynamic-loading-in-c như một điểm khởi đầu. – unwind

+0

Đối với Windows/HĐH khác? – RobS

Trả lời

9

Nếu bạn đang ở trên POSIX, dlopen(), dlsym()dlclose() là tất cả các bạn cần.

Xem man dlsym để biết chi tiết và ví dụ.

Có một tốt article về tải thư viện động và cơ sở hạ tầng plugin là một ví dụ.

EDIT OP đã thêm Windows làm yêu cầu để cách tiếp cận này không hữu ích vì Windows không tuân thủ POSIX. Tuy nhiên có các chức năng tương tự trong WinAPI - xem here.

+0

Althoug có thể tôi sẽ khuyên bạn nên sử dụng một nền tảng độc lập thư viện như ACE http://www.dre.vanderbilt.edu/Doxygen/Current/html/ace/a00110.html – lothar

5

Bạn có thể muốn thử Boost.Extension nhưng hãy cẩn thận: mặc dù tên của nó, nó không phải là một trong các thư viện tăng cường.

Đây là link to its documentation.

+0

rất niceits không tăng (chưa) nhưng nó nằm trong sandbox –

2

Đối với plugin C++, bạn có thể kiểm tra this article chi tiết cách thực hiện với các cuộc gọi posix được đề cập trước đó.

Trích dẫn bài viết:

Cho rằng chúng ta có thể sử dụng các chức năng này để truy cập các chức năng trong một thư viện C, làm thế nào để chúng ta sử dụng chúng để truy cập các lớp học trong một thư viện C++? Có một số vấn đề cần khắc phục. Một là chúng ta phải có khả năng định vị các biểu tượng chúng ta cần trong thư viện. Điều này là phức tạp hơn nó có vẻ vì sự khác biệt giữa cách các ký hiệu được lưu trữ trong các tệp C và C++.

4

Nếu bạn muốn tải thư viện đa nền tảng mà không cần phải phát triển từng API của từng nền tảng, libltdl có thể hữu ích.

Libtool cung cấp một thư viện nhỏ, được gọi là libltdl, nhằm che giấu những khó khăn khác nhau của thư viện dlopening từ các lập trình viên. Nó bao gồm một vài tiêu đề và các tệp nguồn C nhỏ có thể được phân phối với các ứng dụng cần chức năng dlopening. Trên một số nền tảng có liên kết động quá giới hạn cho việc triển khai đơn giản các dịch vụ libltdl, nó yêu cầu GNU DLD hoặc nó sẽ chỉ mô phỏng liên kết động với cơ chế mở rộng dlpreopening của libtool.

libltdl hiện hỗ trợ các cơ chế liên kết động sau:

  • dlopen (Solaris, Linux và hương vị khác nhau BSD)
  • shl_load (HP-UX)
  • LoadLibrary (Win16 và Win32)
  • load_add_on (BeOS)
  • NSAddImage hoặc NSLinkModule (Darwin và Mac OS X)
  • GNU DLD (giả lập liên kết động cho các thư viện tĩnh)
  • libtool của dlpreopen (xem thấy Dlpreopening)

Boost.Extension dường như chỉ hỗ trợ Windows PE dll s, UNIX ELF đối tượng chia sẻ, và Mac Gói OS X Mach-O. Vâng, điều đó có thể đủ cho bạn ...

Các vấn đề liên quan