2011-12-22 26 views
11

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

29

.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.

+0

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. –

+0

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.) –

+0

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ế? –

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