2011-01-22 30 views
22

Tôi đang sử dụng thư viện C++ có thể được xây dựng dưới dạng thư viện được chia sẻ hoặc thư viện tĩnh. Thư viện này sử dụng kỹ thuật nhà máy, nơi các đối tượng tĩnh tự đăng ký khi chương trình bắt đầu và các đối tượng tĩnh được tạo.Cách buộc gcc liên kết các đối tượng C++ tĩnh, không được hỗ trợ từ thư viện

Tính năng này hoạt động miễn là thư viện dùng chung được sử dụng. Khi phiên bản tĩnh được sử dụng, không có đối tượng tĩnh nào được đưa vào chương trình cuối cùng (vì chúng không được tham chiếu trực tiếp) và do đó chức năng của chúng không có sẵn.

Có cách nào để buộc gcc bao gồm tất cả các đối tượng tĩnh từ thư viện khi liên kết không?

Thư viện là Nguồn mở và tôi có thể sửa đổi nó, nếu điều đó có ích.

Trả lời

22

Bạn có thể sử dụng -Wl,--whole-archive -lyourlib, xem manpage cho ld để biết thêm thông tin.

Bất kỳ thư viện tĩnh nào được đề cập sau -Wl, - toàn bộ lưu trữ trên dòng lệnh được bao gồm đầy đủ, bạn cũng có thể tắt tính năng này nếu cần, như trong ví dụ: -Wl,--whole-archive -lyourlib -Wl,--no-whole-archive -lotherlib

+5

-Wl, - toàn bộ lưu trữ khiến nhiều biểu tượng được đưa vào đã được các thư viện khác đưa vào hoặc một số không thể giải quyết được. Có cách nào tốt hơn để đưa các con mồi vào bao gồm các số liệu thống kê không? –

+0

Điều này không có ý nghĩa Gene: nó giống như tải một thư viện được chia sẻ: bạn nhận được toàn bộ thư viện và không có gì khác. Phải thừa nhận rằng ld có khái niệm sai lầm về việc tìm kiếm các tham chiếu bên ngoài, vì vậy bạn cần có thứ tự đúng đắn. – Yttrill

+7

Tắt hành vi bằng '-Wl, - không lưu trữ toàn bộ 'thực sự không phải là tùy chọn, ngay cả khi bạn không có thêm thư viện nào để đưa vào. GCC sẽ thêm tất cả thư viện hệ thống chuẩn vào cuối lệnh của bạn, vì vậy nếu bạn để '--whole-archive' trên tất cả chúng sẽ bị ảnh hưởng bởi nó và nó sẽ gây ra vấn đề biểu tượng trùng lặp @GeneVincent đã nhận xét về –

1

Một loại hack đã giúp tôi. Vẫn phải bao gồm tiêu đề mặc dù.

// in the header with your class 
struct RegistrationHelper { 
    RegistrationHelper(); 
}; 

static RegistrationHelper Helper; 

// in your cpp where you register your class 
RegistrationHelper::RegistrationHelper() {} 
+0

Nhưng giả định rằng bạn có sự cộng tác của tác giả '.cpp', bây giờ cần phải biết về mọi đối tượng trợ giúp đăng ký duy nhất trong thư viện tĩnh. – einpoklum

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