2009-03-17 36 views
40

Tôi có một thư viện của bên thứ ba bao gồm chủ yếu là một số lượng lớn các tệp thư viện tĩnh (.a). Tôi có thể biên dịch nó thành một tệp thư viện .a duy nhất, nhưng tôi thực sự cần nó là một tệp thư viện được chia sẻ .so.Chuyển đổi Thư viện tĩnh thành Thư viện được chia sẻ?

Có cách nào để chuyển đổi tệp .a tĩnh thành tệp .so được chia sẻ không? Hay nói chung là có cách tốt để kết hợp một số lượng lớn các tệp tĩnh .a với một vài tệp đối tượng .o thành một tệp .so duy nhất?

Trả lời

34

Liệu này (với phù hợp -L của khóa học)

gcc -shared -o megalib.so foo.o bar.o -la_static_lib -lb_static_lib 

Không làm điều đó?

+3

Sử dụng gcc -shared đã thực hiện thủ thuật, nhưng chỉ sau khi tôi biên dịch lại bằng -fPIC. Cám ơn đã chỉ tôi hướng đi đúng! –

17

Bạn không thể làm điều này nếu các đối tượng trong thư viện tĩnh được biên dịch mà không có -fPIC hoặc tương tự.

+2

Trên các mục tiêu được hỗ trợ tốt, 'PIC' không cần thiết cho mã thư viện dùng chung. Nó chỉ là kết quả trong việc sử dụng bộ nhớ hiệu quả hơn nhiều (phần lớn, thay vì một thiểu số, các trang có thể được chia sẻ) với chi phí của một số hiệu suất. –

+3

Thiếu -fPIC hoặc giống như ở một số điều kiện dẫn đến SegFault –

9
g++ -shared -o megalib.so foo.o bar.o -Wl,--whole-archive -la_static_lib -lb_static_lib -Wl,--no-whole-archive -lc_static_lib -lother_shared_object 

Tôi không chắc chắn về gcc, nhưng đối với g ++ tôi phải thêm tùy chọn trình liên kết --whole-archive để bao gồm các đối tượng từ thư viện tĩnh trong đối tượng được chia sẻ. Tùy chọn --no-toàn-lưu trữ là cần thiết nếu bạn muốn liên kết đến libc_static_lib.a và libother_shared_object.so, nhưng không bao gồm toàn bộ chúng trong megalib.so.

+1

'-Wl - no-whole-archive' là cần thiết ở cuối dòng lệnh. Xem [chỉnh sửa câu hỏi, tại đây] (http://stackoverflow.com/questions/7935421/linking-archives-a-into-shared-object-so). – ofavre

1

ar -x cũng có thể hữu ích nếu bạn muốn tập trung vào các đối tượng cụ thể từ số .a của mình và bạn không muốn tự thêm bất kỳ thứ gì.

4
ar -x lib***.a 
gcc -shared *.o -o lib***.so 
Các vấn đề liên quan