2009-06-04 22 views
15

Tôi đang cố tạo một thư viện tĩnh chứa các tệp đối tượng và các thư viện tĩnh hiện có đã được biên dịch trước đó trong quá trình xây dựng. Có một cách dễ dàng để làm điều này bằng cách sử dụng "ar", hoặc tôi sẽ cần phải giải nén (ar x library_name) mỗi thư viện và thêm các tập tin đối tượng của nó vào thư viện thống nhất của tôi?Sử dụng "ar" để kết hợp các tệp .o và .a (Linux)

+0

Có thể trùng lặp http: // stackoverflow.com/questions/386579/pack-shared-libraries-into-the-elf –

+0

Không, không trùng lặp. Câu hỏi đó đề cập đến việc cố gắng liên kết lại với các thư viện được chia sẻ, trong khi câu hỏi này đề cập đến các thư viện tĩnh và các đối tượng chưa được liên kết. – ephemient

+0

Nếu bạn kiểm soát quá trình xây dựng, mẫu này có vẻ như một giải pháp sạch: http://stackoverflow.com/a/4318960/78342 – Chinasaur

Trả lời

0

Bạn sẽ cần giải nén tệp đối tượng từ các thư viện khác và gộp các tệp đối tượng được trích xuất vào thư viện tổng hợp của mình.

Cũng xem xét tải gia tăng: ld -r

7

Nếu bạn muốn tạo một thư viện chia sẻ mà bạn có thể sử dụng này:

Bạn có thể sử dụng --whole-archive cờ từ ld:

--whole-archive
Đối với mỗi tệp lưu trữ được đề cập trên dòng lệnh sau tùy chọn --whole-archive, bao gồm mọi tệp đối tượng trong lưu trữ trong liên kết, thay vì tìm kiếm tệp lưu trữ cho các tệp đối tượng được yêu cầu. Điều này thường được sử dụng để biến một tệp lưu trữ thành một thư viện được chia sẻ, buộc mọi đối tượng phải được bao gồm trong thư viện được chia sẻ kết quả. Tùy chọn này có thể được sử dụng nhiều lần.

Hai ghi chú khi sử dụng tùy chọn này từ gcc: Đầu tiên, gcc không biết về tùy chọn này, vì vậy bạn phải sử dụng -Wl, -whole-archive. Thứ hai, đừng quên sử dụng -Wl, -no-whole-archive sau danh sách lưu trữ của bạn, bởi vì gcc sẽ thêm danh sách lưu trữ của riêng nó vào liên kết của bạn và bạn có thể không muốn cờ này ảnh hưởng đến chúng.

Đối với thư viện tĩnh, trước tiên bạn có thể phải trích xuất đối tượng.

Tôi tìm thấy sau cho ar

gnu ar có thể tùy chọn tạo một kho lưu trữ mỏng, trong đó có một chỉ số biểu tượng và tài liệu tham khảo cho các bản gốc của file thành viên của tài liệu lưu trữ. Một kho lưu trữ như vậy rất hữu ích cho việc xây dựng các thư viện để sử dụng trong một xây dựng cục bộ, nơi các đối tượng relocatable được mong đợi vẫn còn, và sao chép nội dung của từng đối tượng sẽ chỉ lãng phí thời gian và không gian. Lưu trữ mỏng cũng được làm phẳng, do đó việc thêm một hoặc nhiều lưu trữ vào một kho lưu trữ mỏng sẽ thêm các phần tử của kho lưu trữ lồng nhau riêng lẻ. Các đường dẫn đến các phần tử của kho lưu trữ được lưu trữ tương đối so với bản lưu trữ.

Có thể bạn có thể sử dụng kho lưu trữ mỏng .

+0

Tùy chọn lưu trữ mỏng là một (tương đối) gần đây. Nó không có sẵn trên Fedora 8 ví dụ (ar 2.17.50). – neuro

+0

+1 bằng cách này cho một lựa chọn thú vị (- lưu trữ-lưu trữ) vừa cứu mạng tôi! – neuro

1

Lưu trữ lưu trữ luôn có thể. Tôi đã không kiểm tra nếu nó hoạt động khi API thực tế đang được gọi từ việc thực hiện.

Ex: ar rc lib1.a obj1.o ar rc lib2.a obj2.o ar rc lib3.a lib1.a lib2.a

you can check the contents of lib3.a by trying out. 

    ar x lib3.a which would extract lib1.a and lib2.a 

Nhưng bạn cần phải xây dựng gọi API từ obj1.o và obj2.o. Sau đó, không cần phải trích xuất các tệp đối tượng từ lưu trữ riêng lẻ.

Hy vọng điều đó sẽ hữu ích!

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