2009-03-17 26 views
43

Sự khác nhau giữa hai loại tệp này là gì. Tôi thấy rằng ứng dụng C++ của tôi liên kết với cả hai loại trong quá trình xây dựng tệp thi hành..o tệp vs .a tệp

Cách tạo tệp .a? liên kết, tham chiếu và đặc biệt là các ví dụ, được đánh giá cao.

Trả lời

46

.o tệp là đối tượng. Chúng là đầu ra của trình biên dịch và đầu vào cho trình liên kết/thủ thư.

.a tệp là lưu trữ. Chúng là các nhóm đối tượng hoặc các thư viện tĩnh và cũng được nhập vào trình liên kết.

Nội dung bổ sung

tôi không chú ý đến "ví dụ" một phần của câu hỏi của bạn. Nói chung, bạn sẽ sử dụng một makefile để tạo các thư viện tĩnh.

AR = ar 
CC = gcc 

objects := hello.o world.o 

libby.a: $(objects) 
    $(AR) rcu [email protected] $(objects) 

%.o: %.c 
    $(CC) $(CFLAGS) -c $< -o [email protected] 

này sẽ biên dịch hello.cworld.c thành các đối tượng và sau đó lưu trữ chúng vào thư viện. Tùy thuộc vào nền tảng, bạn cũng có thể cần chạy tiện ích được gọi là ranlib để tạo bảng nội dung trên lưu trữ.

Một lưu ý thú vị: .a tệp kỹ thuật là tệp lưu trữ chứ không phải thư viện. Chúng tương tự như các tệp zip không nén mặc dù chúng sử dụng định dạng tệp cũ hơn nhiều. Mục lục được tạo ra bởi các tiện ích như ranlib là những gì tạo lưu trữ một thư viện . Các tệp lưu trữ Java (.jar) tương tự ở chỗ chúng là các tệp zip có một số cấu trúc thư mục đặc biệt được tạo bởi trình lưu trữ Java.

+1

Đây là về chủ đề Make nhưng chỉ nghĩ rằng tôi muốn thêm, bạn cũng có thể thay thế '$ (đối tượng)' trên dòng công thức ('$ (AR) rcu $ @ $ (đối tượng) ') của mục tiêu' libby.a' với '$ <' hoặc '$ ^' để tham chiếu đầu tiên hoặc tất cả các mục tiêu tiên quyết, tương ứng.Điều này sẽ có tác dụng tương tự, nhưng cũng loại bỏ dự phòng chỉ định '$ (đối tượng)' hai lần, cần cập nhật tham chiếu ở hai vị trí nếu tên biến hoặc điều kiện tiên quyết thay đổi và cũng ít xảy ra hơn. –

+1

@ShammelLee - Tôi thường tránh '$ ^' vì nó là một phần mở rộng của GNU Make và không có trong [BSD make] (https://www.freebsd.org/cgi/man.cgi?make (1)) hoặc trong [POSIX make] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/make.html). Tôi không quan trọng vì hầu hết các bản phân phối Linux đều dựa trên GNU nhưng việc chuyển đổi '/ bin/sh' từ bash sang dấu gạch ngang là đủ để làm cho tôi tiếp tục tránh các phần mở rộng cụ thể của GNU. –

+0

điều cần biết. Cảm ơn. –

1

Tôi tin rằng tệp .a là tệp lưu trữ có thể chứa nhiều tệp đối tượng.

14

Tệp .o là kết quả của việc biên dịch một đơn vị biên dịch đơn (thực chất là tệp mã nguồn, với tệp tiêu đề được liên kết) trong khi tệp .a là một hoặc nhiều tệp .o được đóng gói dưới dạng thư viện.

5

Bạn có thể sử dụng để tạo ra ar.a tập tin (thư viện tĩnh) từ .o file (file object)

Xem man ar để biết chi tiết.

11

Câu trả lời của D Shawley rất tốt, tôi chỉ muốn thêm một vài điểm vì các câu trả lời khác phản ánh sự hiểu biết không đầy đủ về những gì đang xảy ra.

Hãy nhớ rằng các tệp lưu trữ (.a) không bị hạn chế để chứa tệp đối tượng (.o). Chúng có thể chứa các tệp tùy ý. Không thường hữu ích, nhưng hãy xem dynamic linker dependenciy info embedded in an archive để có một mẹo liên kết ngu ngốc.

Cũng lưu ý rằng các tệp đối tượng (.o) không nhất thiết là kết quả của một đơn vị biên dịch đơn lẻ. Có thể liên kết một phần một số tệp đối tượng nhỏ hơn thành một tệp lớn hơn.

http://www.mihaiu.name/2002/library_development_linux/ - tìm kiếm trong trang này để "một phần"

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