2010-02-25 24 views
29

Tôi đang cố gắng biên dịch một cái gì đó tĩnh và tôi đang cố gắng xử lý tất cả những phụ thuộc này. Tôi biết rằng các tệp .dll dành cho các phụ thuộc được liên kết động sẽ được yêu cầu bởi đầu ra cuối cùng, nhưng các tệp .a và .lib là gì và khi nào bạn cần mỗi tệp?Sự khác nhau giữa các tệp .lib và .a là gì?

Trả lời

28

.a là bản lưu trữ mã: được biên dịch nhưng không được liên kết. Bạn sẽ liên kết tĩnh với nó trong bước liên kết cuối cùng của chương trình của bạn.

.lib có thể giống như .a hoặc một thư viện nhập "ma thuật": một trình giữ chỗ mỏng khiến bạn yêu cầu .dll trong thời gian chạy.

+0

Tôi đang biên soạn khuôn khổ QT với thư viện .a OpenSSL, nhưng bằng cách nào đó bản thực thi cuối cùng của tôi được QT sản xuất vẫn yêu cầu một dll OpenSSL bên ngoài để chạy. Bạn có bất kỳ ý tưởng làm thế nào điều này có thể là trường hợp cho rằng tôi đang sử dụng một thư viện .a? – Nantucket

+0

Nội dung của OpenSSL được biên dịch như thế nào? Bạn liên kết tệp thực thi cuối cùng của mình như thế nào? – crazyscot

+0

Tôi không chắc chắn về "require a .dll at runtime". Bạn sẽ không cần .dll nếu dự án của bạn đang sử dụng thư viện tĩnh .lib (trừ khi có các phụ thuộc .dll mà bạn chưa xác định chính xác). – ha9u63ar

4

Thông thường, .a là dành cho các thư viện tĩnh trong Linux trong khi .lib là giống nhau nhưng trên Windows. Nhưng tất nhiên nó chỉ là một quy ước.

19

Trên hệ thống Unix, bạn có các tệp .a. Đây là những lưu trữ đơn giản của các tệp đối tượng (.o).

Trên Windows, có .lib tệp, khá giống nhau, nhưng đối với Windows thay vì Unix.

Một sự tinh tế bổ sung là để liên kết một số mã với DLL (trên Windows), bạn phải liên kết với tệp .lib chứa trình bao bọc đơn giản gọi DLL. Trên hệ thống Unix, theo truyền thống, không cần các trình bao bọc như vậy (trình liên kết đủ thông minh để tạo ra chúng một cách nhanh chóng).

+0

Cảm ơn bạn đã trả lời câu hỏi này, phát hiện ra tôi đang cố gắng biên dịch với cờ Windows ở đâu đó! :) –

+0

Có sự khác biệt nào giữa .a được tạo trong cửa sổ và unix không? – samnaction

5

Điều tôi chưa thấy được đề cập ở đây là thực tế đáng ngạc nhiên rằng, ít nhất một số thời gian, tệp .a và tệp .lib là thực sự cùng định dạng nhị phân. Mặc dù tôi không thể tìm thấy bất cứ điều gì nói nhiều trên trang web mingw, tôi nhận thấy rằng khi cố gắng để có được trình biên dịch 64-bit của MS Visual C++ cl.exe để liên kết trong một tệp .dll được tạo bằng trình biên dịch mingw-w64 g ++, nó vui vẻ đã chấp nhận dòng lệnh

cl /EHsc /Ipath\to\include gmp_test.cpp path\to\lib\libgmp.dll.a 

và tệp .exe kết quả chạy ngay khi tôi sao chép tệp .dll tương ứng vào thư mục hiện tại. (Nó đã lầm bầm cảnh báo "Cảnh báo dòng lệnh D9024: loại tệp nguồn không được công nhận 'đường dẫn \ tới \ lib \ gmp-6.0.0 \ lib \ libgmp.dll.a', tệp đối tượng giả định".)

Bằng chứng khác là lệnh Linux file đã báo cáo "bản lưu trữ ar hiện tại" cho một số tệp của mỗi tiện ích mở rộng (.lib hoặc .a) tôi đã thử.

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