2009-08-07 54 views
14

Giả sử tôi có một static C++ lib, static.lib và tôi muốn gọi một số hàm từ một lib chia sẻ C++, nói shared.lib. Có thể không?Có thể liên kết Thư viện tĩnh C++ với thư viện được chia sẻ không?

Bây giờ giả sử rằng tôi có một lib được chia sẻ khác, hãy nói shared2.lib liên kết tới static.lib nhưng không liên kết với shared.lib. Trình liên kết có tự động liên kết shared2.lib với shared.lib trong trường hợp này không?

Tôi đang sử dụng Microsoft Visual Studio 2003.

Trả lời

22

Thư viện tĩnh không được liên kết. Chúng chỉ là một tập hợp các tệp đối tượng (* .obj hoặc * .o) được lưu trữ cùng nhau thành một tệp thư viện (giống như tệp tar/zip) để giúp trình liên kết tìm thấy các ký hiệu cần thiết dễ dàng hơn.

Một lib tĩnh có thể gọi hàm không được xác định (nhưng chỉ được khai báo trong tệp tiêu đề), vì nó chỉ được biên dịch. Sau đó, khi bạn liên kết một exe hoặc dll sử dụng lib tĩnh, bạn sẽ phải liên kết với một thư viện khác cung cấp được gọi từ lib tĩnh nhưng không được định nghĩa trong nó.

Nếu bạn muốn người liên kết tự động liên kết các thư viện khác, đề xuất của Stephen sẽ hoạt động và được sử dụng bởi các thư viện rất có uy tín như tăng cường và lưu trữ. Để làm điều này, hãy đặt pragma trong tệp tiêu đề chính cho thư viện tĩnh. Bạn nên bao gồm thư viện tĩnh và người phụ thuộc của nó.

Tuy nhiên IMO tính năng này thực sự có nghĩa là cho các nhà văn thư viện, nơi thư viện nằm trong đường dẫn thư viện hệ thống để người liên kết dễ dàng tìm thấy nó. Ngoài ra trong trường hợp tăng và stlport họ sử dụng tính năng này để hỗ trợ nhiều phiên bản của cùng một thư viện với các tùy chọn được xác định với #define s nơi các tùy chọn khác nhau yêu cầu các phiên bản khác nhau của thư viện được liên kết. Điều này có nghĩa là người dùng ít có khả năng cấu hình tăng một chiều và liên kết với một thư viện được cấu hình khác.

Tùy chọn của tôi cho mã ứng dụng là liên kết rõ ràng các phần bắt buộc.

6

Các mối liên kết sẽ không tự động mang lại trong các thư viện khác, nhưng bạn có thể sử dụng #pragma comment (lib, "static.lib") để đơn giản hóa quá trình liên kết các tập tin bổ sung bằng cách thêm các pragma các tập tin tiêu đề của bạn.

0

Nói rằng tôi có một C++ lib tĩnh, static.lib và tôi muốn gọi một số chức năng từ C++ lib chia sẻ, nói shared.lib. Có thể không?

Có ví dụ khi bạn gọi các chức năng cửa sổ từ trong thư viện tĩnh của bạn, chúng thường là từ thư viện động nên không có sự khác biệt.

Bây giờ giả sử rằng tôi có một chia sẻ lib, nói shared2.lib mà liên kết đến static.lib nhưng không liên kết với shared.lib. Trình liên kết có tự động liên kết shared2.lib với shared.lib trong trường hợp này không?

Có những phụ thuộc như thế này có thể gây ra sự cố sau này, tôi khuyên bạn nên tự động tải thư viện bằng cách sử dụng LoadLibrary(), theo cách đó bạn không cần theo dõi các phụ thuộc đó trong khi biên dịch/liên kết.

+0

Tôi đồng ý rằng bạn nên cẩn thận với các phụ thuộc thư viện, nhưng tôi nghĩ LoadLibrary là quá mức cần thiết trong trường hợp này.Tôi chỉ yêu cầu nó cho kiến ​​trúc kiểu plugin. – iain

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