2012-11-01 9 views
6

Vì vậy, tôi có một giải pháp C++ chứa 3 dự án (2 DLL và 1 .exe).Dự án DLL không tạo tệp .exp và .lib

đây là phụ thuộc cơ bản đại diện:

Ứng dụng -> DLL2

Ứng dụng -> DLL1

DLL2 -> DLL1

Vấn đề là tôi có DLL2 (khi xây dựng nó) không tạo ra .dll nhưng không tạo ra .lib và .exp Tôi cần tham chiếu đúng DLL2 trong dự án Ứng dụng. Tuy nhiên, DLL1 không tạo ra các tập tin này và tôi đã so sánh các thiết lập của DLL1 với DLL2, và tôi không thể tìm thấy sự khác biệt có thể là gì.

Trả lời

4

Vấn đề là DLL2 chỉ có tệp .h và không có nội dung trong bất kỳ tệp .cpp được liên kết nào. Vì vậy, IDE không thấy sự cần thiết của việc tạo tập tin .lib.

+0

cảm ơn câu trả lời này đã giúp tôi. tôi cũng phải thêm ít nhất một phương thức 'static __declspec (dllexport)' để làm cho tệp 'lib' xuất hiện – javapowered

9

Giải thích đơn giản cho điều đó là bạn chỉ quên xuất mọi thứ. Trình liên kết sẽ không tạo tệp .lib/.exp nếu không có xuất. Bạn có thể xác minh điều này bằng cách chạy dumpbin.exe /exports trên DLL. Với kỳ vọng rằng bạn không thấy gì cả.

Sử dụng __declspec(dllexport) để xuất biểu tượng từ DLL. Hoặc tệp .def.

+0

Và hãy nhớ bao gồm các tiêu đề xác định macro xuất thông thường. :) –

0

Tôi vừa phát hiện ra một cách khác để gây ra cùng một điều xảy ra. Tôi đã di chuyển một số thường trình mà tôi đã phát triển và thử nghiệm dưới dạng các thường trình dịch vụ trong một DLL khác thành một DLL của riêng chúng. Vì di chuyển này đã được lên kế hoạch trước khi tôi viết dòng mã đầu tiên, chúng không được đánh dấu để xuất và do đó, sử dụng quy ước gọi mặc định của dự án đó là __cdecl. Khi tôi xây dựng thư viện, môi trường xây dựng không tạo tệp .LIB. Sau khi điều tra, và lấy cảm hứng từ việc đề cập đến __declspec (dllimport) trong chủ đề này, tôi nhận ra rằng, mặc dù tôi đã chuyển các khai báo vào tệp tiêu đề mẫu được tạo bởi Trình hướng dẫn dự án mới, tôi quên bỏ tên của quy ước gọi được tạo ra macro vào các nguyên mẫu.

Với quy ước cuộc gọi được chỉ định, cả trong tiêu đề và tệp CPP giữ các triển khai, tôi nhận tệp .LIB được mong đợi.