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?
Trả lời
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
Vấn đề là bạn có thể bỏ qua '* .o', nếu bạn không có chúng – Lol4t0
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
. 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
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.
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
- 1. Có thể xây dựng một thư viện được chia sẻ với thư viện liên kết tĩnh được sử dụng không?
- 2. Liên kết các thư viện tĩnh, chia sẻ một thư viện tĩnh khác
- 3. xây dựng và liên kết một thư viện chia sẻ
- 4. Có thể liên kết Thư viện tĩnh C++ với thư viện được chia sẻ không?
- 5. Xây dựng thư viện được chia sẻ liên kết với thư viện chia sẻ không chuẩn khác
- 6. Liên kết thư viện được chia sẻ với thư viện tĩnh: thư viện tĩnh có được biên dịch khác với một ứng dụng đang liên kết nó không?
- 7. Trộn các thư viện tĩnh và thư viện chia sẻ
- 8. C++ Thư viện được chia sẻ liên kết tĩnh
- 9. scons xây dựng cả thư viện tĩnh và chia sẻ
- 10. Liên kết thư viện được chia sẻ bằng gcc
- 11. linux g ++ liên kết 64 bit mã thư viện chia sẻ với thư viện tĩnh
- 12. xây dựng thư viện được chia sẻ cho android
- 13. Xây dựng thư viện tĩnh
- 14. làm cách nào để buộc trình liên kết sử dụng thư viện được chia sẻ thay vì thư viện tĩnh?
- 15. Makefile cho Thư viện được chia sẻ?
- 16. Liên kết tĩnh các thư viện SDL2
- 17. exe và chia sẻ các thư viện tĩnh cùng
- 18. Có thể liên kết một thư viện tĩnh với Java thông qua JNI không?
- 19. Biên dịch một thư viện chia sẻ tĩnh
- 20. Xung đột biểu tượng thư viện tĩnh và chia sẻ?
- 21. Chuyển đổi Thư viện tĩnh thành Thư viện được chia sẻ?
- 22. Tôi có cần các thư viện tĩnh để liên kết tĩnh không?
- 23. CMake Error: TARGETS không có THƯ VIỆN THƯ VIỆN cho mục tiêu thư viện được chia sẻ
- 24. Có thể nhận CMake để xây dựng cả phiên bản tĩnh và chia sẻ của cùng một thư viện không?
- 25. Xây dựng OpenCV làm thư viện tĩnh
- 26. Tạo cả thư viện C++ tĩnh và chia sẻ
- 27. Tải thời gian cho thư viện được chia sẻ và thư viện tĩnh
- 28. Liên kết tĩnh của chức năng thư viện được chia sẻ trong gcc
- 29. VS2010: Liên kết trong một thư viện tĩnh tĩnh
- 30. Thư viện được chia sẻ trong Go?
.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