Tôi có câu hỏi chung về cách .dll/.libs được giả sử để sử dụng. Tôi tạo ra một dll được sử dụng cho dự án của tôi, tuy nhiên, tôi nhận thấy rằng khi tôi đi để biên dịch tôi cần phải liên kết tĩnh .lib liên kết với các .dll cho dự án để biên dịch (nếu không có lỗi liên kết "gây tử vong lỗi LNK1107: tệp không hợp lệ hoặc bị hỏng: không thể đọc ở 0x300 "). Vì vậy, sau đó khi tôi đi redistrobute dự án của tôi, sau đó cập nhật nó trong tương lai, tôi sẽ cần phải gửi một .exe mới và một dll mới chứ không phải chỉ là một dll mới? Nếu đó là trường hợp, thì tại sao bận tâm sử dụng .dll?Lib và DLL liên kết với lỗi exe "không thể đọc tại 0x300"
Trả lời
.lib chứa sơ đồ cho các chức năng, vv được xuất bởi DLL. Bạn liên kết .lib vào EXE của bạn và bây giờ EXE của bạn biết cách gọi các hàm. Nhưng tất nhiên không có chức năng ở đó - các cuộc gọi không đi đến đâu cả. Tại thời điểm tải, khi hệ điều hành tải EXE của bạn, nó cũng nạp tệp DLL của bạn, và sau đó nó vá EXE - nơi mà EXE gọi vào cuống, trình nạp thay thế bằng một cuộc gọi vào hàm thực trong DLL.
Thông thường bạn không cần gửi .lib cho khách hàng của mình. Tuy nhiên, nếu khách hàng của bạn muốn viết EXE của riêng họ sử dụng DLL của bạn thì bạn sẽ cần phải gửi cho họ .lib để họ có thể liên kết EXE của họ với nó.
Lỗi trình kết nối LNK1107 có nghĩa là bạn đã cố gắng liên kết đến tệp DLL thay vì .lib. Điều đó luôn luôn sai, bởi vì theo định nghĩa một DLL được liên kết động vào thời gian chạy, thay vì tĩnh tại thời gian xây dựng.
- 1. Visual C++ - Liên kết plugin DLL với EXE?
- 2. Eclipse không thể liên kết với kernel32.lib
- 3. Dự án C++ biên dịch thành lib tĩnh, không thành công (lỗi liên kết) dưới dạng lib động. tại sao?
- 4. Liên kết EXE 64 bit có thể chống lại các DLL 32 bit không?
- 5. Tệp DLL và LIB
- 6. Làm thế nào để cập nhật một dll C++ mà không cần phải liên kết lại tệp exe với tệp lib?
- 7. cách liên kết với lib động (.so) và static libc.a
- 8. Tệp DLL và LIB - điều gì và tại sao?
- 9. Dự án DLL không tạo tệp .exp và .lib
- 10. Tại sao dự án Visual C++ .exe của tôi tạo tệp .lib và .exp?
- 11. Lỗi tham chiếu không xác định Qt/mingw32 ... không thể liên kết .lib
- 12. Lỗi liên kết lạ liên kết đến opencv ... "LNK1107: tệp không hợp lệ hoặc bị hỏng: không thể đọc tại 0x2E8"
- 13. boost :: chủ đề build lỗi (không thể liên kết lib && chưa được giải quyết bên ngoài)
- 14. Liên kết không được quản lý C++ DLL với quản lý C++ lớp thư viện DLL
- 15. Liên kết HTML để gọi exe với tham số
- 16. Ngụ ý và liên kết rõ ràng với một DLL
- 17. Sự khác biệt giữa .dll và .exe?
- 18. Khi xây dựng một tệp DLL, tệp LIB được tạo có chứa tên DLL không?
- 19. LNK2005 Lỗi liên kết các thư viện openCV tĩnh với Visual Studio và QT Creator
- 20. Liên kết không thể tìm thấy biểu tượng, nhưng các thư viện được đọc và ký hiệu tồn tại
- 21. Dừng tạo .lib và .exp khi xây dựng một .dll với Visual Studio
- 22. Tại sao QtCreator/MSVC liên kết hệ thống DLL 64 bit với ứng dụng 32 bit của tôi?
- 23. Nhúng * .exe vào một dll
- 24. Lỗi valgrind khi được liên kết với -static - Tại sao?
- 25. Tại sao không thể const T * và liên kết với T *?
- 26. Upgrade của BOOST 1,35-1,43 gây lỗi mối liên kết với __pRawDllMain (MFC liên quan)
- 27. Chức năng gọi lại giữa Delphi DLL và Delphi EXE
- 28. Tệp Header (.h), tệp Thư viện (.lib) và tệp DLL (.dll) có liên quan như thế nào
- 29. giao diện giữa exe và dll với thư viện thời gian chạy C/C++ khác nhau
- 30. Chuyển đổi thư viện liên kết tĩnh thành dll động
Tôi đang cố gắng những gì bạn đã đề xuất. Vấn đề của tôi là khi tôi đang xây dựng trong chế độ gỡ lỗi không có tập tin lib được tạo ra. Chỉ có tập tin dll được tạo ra. làm thế nào tôi có thể tạo tập tin lib trong phiên bản gỡ lỗi. –
Nhận xét của bạn dường như gợi ý rằng bạn nhận được một tệp lib trong bản phát hành bản phát hành, nhưng không phải trong bản dựng gỡ lỗi. Có đúng không? Nếu vậy, hãy chắc chắn rằng bạn đã đặt cùng các tùy chọn trình liên kết trong cả hai bản dựng (ngoại trừ, tất nhiên, đối với những người cần phải khác nhau giữa phát hành và gỡ lỗi.) –
Trình liên kết thường sẽ tự động tạo thư viện nhập nếu DLL của bạn chứa bất kỳ với hàm __declspec (dllexport), hoặc nếu bạn xuất khẩu các hàm một cách rõ ràng với một tệp DEF. Có lẽ __declspec (dllexport) của bạn bị loại trừ bởi trình biên dịch bởi vì nó được bao quanh bởi #ifndef (_DEBUG) hoặc một cái gì đó như thế? –