5

Tôi có một dự án mà tôi có một thư viện tĩnh libhelper.a và một thư viện khác có thư viện đối tượng được chia sẻ thực tế của tôi, libtestlib.so. Mục tiêu của tôi là liên kết libhelper.a vào libtestlib.so. Có thể đó trên Linux/BSD? Khi tôi cố gắng và tạo ra một chương trình thử nghiệm Tôi đã nhận các lỗi sau đây:Trộn các thư viện tĩnh và thư viện chia sẻ

./prog1:/usr/local/lib/libtestlib.so.1.0: undefined biểu tượng ''

tôi đoán là điều này xảy ra vì libhelper.a không được biên dịch với -fPIC trong khi libtestlib.so là. Cách thích hợp để xây dựng các chương trình sử dụng thư viện chia sẻ cũng có những phụ thuộc vào các thư viện tĩnh là gì?

Cảm ơn!

+0

"liên kết libhelper.a vào libtestlib.so" Cái gì? –

+0

Bạn đã thử làm gì cho đến nay? Trong mọi trường hợp, tôi không biết bất kỳ cách nào để liên kết mã không phải PIC vào một thư viện được chia sẻ. Các thư viện tĩnh thường chỉ được liên kết với các tệp thực thi, đó là lý do tại sao chúng hiếm khi được biên dịch với PIC. Bạn không thể liên kết cả hai thư viện vào thực thi, hoặc xây dựng cả hai với PIC ngay từ đầu? – Philipp

Trả lời

11

Mục tiêu của tôi là liên kết libhelper.a với libtestlib.so. Có thể đó trên Linux?

chắc. Điều này nên làm:

gcc -shared -fPIC -o libtestlib.so $(OBJS) \ 
    -Wl,--whole-archive -lhelper -Wl,--no-whole-archive 

libhelper.a không được biên soạn với -fPIC

Cách tốt nhất để xây dựng lại libhelper.a với -fPIC. Nếu không thể, lệnh trên sẽ vẫn hoạt động trên Linux/ix86, nhưng không hoạt động, ví dụ: Linux/x86_64.

Cách thích hợp để xây dựng chương trình sử dụng thư viện được chia sẻ cũng có phụ thuộc vào thư viện tĩnh là gì?

Nếu bạn bao gồm libhelper.a vào libtestlib.so như trên, sau đó đơn giản:

gcc main.c -ltestlib 

là tất cả các bạn cần. Nếu bạn khăng khăng liên kết với libhelper.a, thì bạn phải thông báo cho người dùng cuối rằng anh ta phải liên kết với ví dụ:

gcc main.c -ltestlib -lhelper 

Không có cách nào để chỉ định rằng libtestlib.so tùy thuộc vào libhelper.a.

+0

Cảm ơn, tôi có thể xây dựng lại libhelper.a với -fPIC vì vậy tôi sẽ tiếp tục làm điều đó. –

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