2011-12-23 45 views
11

Tôi có một thư viện dùng chung được viết bằng C++. Nó xuất khẩu một giao diện có thể nhìn thấy được thực hiện bởi các hàm extern "C" tạo ra, phá hủy và thao tác các loại mờ.Thư viện được chia sẻ C++ được gọi từ C

Bây giờ, tôi muốn có một chương trình C thuần túy sử dụng thư viện này.

Tôi có thể làm điều này (nền tảng độc lập) không? Khi nào thì thời gian chạy C++ và các đối tượng tĩnh C++ được khởi tạo nếu main không được viết bằng C++?

Trả lời

5

Giai đoạn khởi tạo phụ thuộc vào nền tảng. Trong trường hợp của Linux, các thư viện được nạp động có thể có các ký hiệu được khai báo đặc biệt được gọi tự động bởi dlopen() khi thư viện được tải.

Xem manpage cho dlopen(3), phần Các ký hiệu lỗi thời init() và fini() để biết thêm thông tin.

Trình khởi chạy tĩnh được đánh dấu ngầm là __attribute__((constructor)), vì vậy nói chung bạn không phải làm bất cứ điều gì đặc biệt để gọi chúng khi thư viện được tải. Tôi nghi ngờ điều này giống hoặc tương tự trên các nền tảng khác.

+0

Phụ lục. (glibc :) init/fini được cung cấp bởi môi trường thời gian chạy (crtS.o) và được sử dụng để khởi tạo các đối tượng thời gian tĩnh và các hàm gọi được đánh dấu __attribute __ ((constructor)), do đó ghi đè init/fini một mình có thể dẫn đến các vấn đề , bao gồm cả bailing ra do một định nghĩa biểu tượng đôi. –

+0

@ jørgensen: Đó có phải là lý do tại sao chúng không được chấp nhận? – onitake

4

Tôi có thể làm điều này (nền tảng độc lập) không?

Tải thư viện là hoạt động phụ thuộc nền tảng.

Khi nào thì thời gian chạy C++ và đối tượng tĩnh C++ được khởi tạo nếu chính không được viết bằng C++?

Không quan trọng. Chúng sẽ được khởi tạo trước khi nhập chính.

+1

Vâng, một thư viện vẫn có thể được tải thủ công sau khi 'chính' đã được nhập. Và "' Họ sẽ được khởi tạo trước khi nhập chính. "" Là một quan niệm sai lầm. Nó được thực hiện xác định cho dù initialisation của một đối tượng tĩnh xảy ra trước khi 'main' được nhập vào, hoặc bất kỳ thời gian trước khi sử dụng đầu tiên của nó. Nhưng đối với tất cả các mục đích thực tế, có, chúng được khởi tạo trước 'main', hoặc ngay sau khi thư viện được tải. – jweyrich

1

Thông thường, hệ thống thư viện được chia sẻ có điểm nhập riêng để thực hiện tác vụ này, không phải main nhưng DLL có DLLMain nơi triển khai có thể đặt mã như vậy. Tuy nhiên, trong trường hợp chung, nó không phải là doanh nghiệp của bạn và đó là công việc của bất kỳ trình biên dịch bạn đã sử dụng để đối phó với vấn đề này.

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