2012-01-10 55 views
7

Tôi có một loạt các thư viện tĩnh (* .a), và tôi muốn xây dựng một thư viện chia sẻ (* .a) để liên kết với các thư viện tĩnh đó (* .a). Làm thế nào tôi có thể làm như vậy trong gcc/g ++? Cảm ơn!Tôi có thể xây dựng một thư viện được chia sẻ bằng cách liên kết các thư viện tĩnh không?

+1

.a không phải là thư viện được chia sẻ. Bạn có thể đưa ra một ví dụ về những gì bạn đang cố gắng làm không? – bdonlan

Trả lời

6

Tôi không thể thấy lý do tại sao bạn không thể chỉ xây dựng các tệp của thư viện động của bạn thành tệp .o và liên kết với;

gcc -shared *.o -lstaticlib1 -lstaticlib2 -o mylib.so 
+0

Vấn đề là bạn có thể bỏ qua '* .o', nếu bạn không có chúng – Lol4t0

+0

Thư viện tĩnh sẽ chỉ lấy mã của chúng nếu nó thực sự được tham chiếu, vì vậy bạn không thể bỏ qua tất cả' .o' – bdonlan

+0

. rằng nếu nhiều cá thể của cùng một thư viện tĩnh có mặt trong cùng một tệp thực thi (được tải gián tiếp qua các lib được chia sẻ chứa các lib tĩnh), những điều lạ có thể xảy ra – bdonlan

13

Bạn có thể (chỉ cần trích xuất tất cả các .o tập tin và liên kết chúng với -shared để thực hiện một .so), nhưng cho dù nó hoạt động, và cũng nó hoạt động như thế nào, phụ thuộc vào nền tảng này và liệu thư viện tĩnh đã được biên soạn như mã độc lập vị trí (PIC). Trên một số nền tảng (ví dụ: x86_64), mã không phải PIC không hợp lệ trong các thư viện được chia sẻ và sẽ không hoạt động (thực sự tôi nghĩ rằng trình liên kết sẽ từ chối thực hiện .so). Trên các nền tảng khác, mã không phải PIC sẽ hoạt động trong các thư viện chia sẻ, nhưng bản sao trong bộ nhớ của thư viện không thể chia sẻ giữa các chương trình khác nhau bằng cách sử dụng nó hoặc thậm chí các phiên bản khác nhau của cùng một chương trình.

+1

Cảm ơn câu trả lời rất hữu ích này! Tôi đoán đây là lời giải thích tốt nhất cho lỗi này khi làm điều này trên x86_64: 'di dời R_X86_64_32S chống lại 'g_gGlobalVariable' không thể được sử dụng khi thực hiện một đối tượng được chia sẻ; biên dịch lại với -fPIC ' – dashesy

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