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
.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.
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.
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).
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 đó! :) –
Có sự khác biệt nào giữa .a được tạo trong cửa sổ và unix không? – samnaction
Đ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ử.
- 1. sự khác nhau giữa các tệp .so và .a là gì?
- 2. Sự khác nhau giữa 'a và' _l là gì?
- 3. Sự khác nhau giữa double a = a + int b và int a + = double b là gì?
- 4. Sự khác nhau giữa các tệp .dll, .lib, .h là gì?
- 5. Sự khác nhau giữa các tệp trợ giúp và các tệp lib trong đường ray
- 6. sự khác nhau giữa 'Float a = 3f' và 'Float a = 3.0' trong java là gì?
- 7. Sự khác nhau giữa $ a và $$ a trong php là gì?
- 8. Trong C++, sự khác nhau giữa static_cast <double> (a) và double (a) là gì?
- 9. Sự khác nhau giữa tệp .xib và .storyboard là gì?
- 10. Sự khác nhau giữa: = và + = trong tạo tệp là gì?
- 11. Sự khác biệt giữa "new A()" và "A.newInstance()" là gì?
- 12. Sự khác biệt giữa các biến cục bộ auto int a và int a là gì?
- 13. Sự khác nhau giữa InputStream và ByteArrayInputStream là gì?
- 14. sử dụng .exp là gì và sự khác biệt giữa .lib và .dll
- 15. Sự khác nhau giữa mảng và đối tượng là gì?
- 16. Sự khác nhau giữa hg quên và hg là gì?
- 17. Sự khác nhau giữa 'eq' và '= ~' trong Perl là gì?
- 18. Sự khác biệt giữa "a là b" và "id (a) == id (b)" trong Python là gì?
- 19. Sự khác nhau chính giữa signcode.exe và signtool.exe là gì?
- 20. Sự khác nhau giữa từ điển và mảng là gì?
- 21. Sự khác nhau giữa FileStream.Flush() và FileStream.Flush (True) là gì?
- 22. Sự khác nhau giữa a.ne (null) và a! = Null trong Scala là gì?
- 23. Sự khác nhau giữa isSaleable() và isAvailable() là gì?
- 24. Sự khác nhau giữa app.doScript và $ .evalFile là gì?
- 25. Sự khác nhau giữa sysfs_create_file() và sysfs_create_group() là gì?
- 26. Sự khác nhau giữa cat_id và term_id là gì?
- 27. Sự khác nhau giữa xelement.load và xdocument.load là gì?
- 28. Sự khác nhau giữa Href và Url.Content là gì?
- 29. Sự khác nhau giữa Server.MapPath và HostingEnvironment.MapPath là gì?
- 30. Sự khác nhau giữa AssemblyVersion, AssemblyFileVersion và AssemblyInformationalVersion là gì?
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
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
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