2010-05-12 34 views
12

Tôi có một giải pháp bao gồm 3 dự án. Một là một thư viện tĩnh và hai là các tệp .exe dựa trên bàn điều khiển phụ thuộc vào và liên kết với thư viện này. Cài đặt của họ có vẻ giống hệt nhau. Tôi xây dựng một trong số họ:Tại sao dự án Visual C++ .exe của tôi tạo tệp .lib và .exp?

1> ------ Build started: Dự án: masksample, Cấu hình: Debug Win32 ------
1> Biên soạn ...
1> stdafx cpp
1> Biên soạn ...
1> masksample.cpp
1> Lập biểu hiện với các nguồn lực ...
1> Liên kết ...
1> LINK: C: \ Users \ DarekSz \ Praca \ cci \ Debug \ masksample.exe không tìm thấy hoặc không được xây dựng bởi liên kết gia tăng cuối cùng; thực hiện liên kết đầy đủ
1> Nhúng tệp kê khai ...
1> maskample - 0 lỗi (0), 0 cảnh báo
========== Xây dựng: 1 thành công, 0 không thành công, 1 to-date lên, 0 bỏ qua ==========

Sau đó, tôi tiếp tục xây dựng khác:

1> ------ Build started: Dự án: calibsample, Cấu hình: Gỡ lỗi Win32 ------
1> Biên dịch ...
1> stdafx.cpp
1> Biên soạn ...
1> calibsample.cpp
1> Lập biểu hiện với các nguồn lực ...
1> Liên kết ...
1> LINK: C: \ Users \ DarekSz \ Praca \ CCI \ Gỡ lỗi \ calibsample.exe không tìm thấy hoặc không được xây dựng bởi liên kết gia tăng cuối cùng; thực hiện liên kết đầy đủ
1> Tạo thư viện C: \ Users \ DarekSz \ Praça \ cci \ Debug \ calibsample.lib và đối tượng C: \ Users \ DarekSz \ Praça \ cci \ Debug \ calibsample.exp
1> Nhúng tệp kê khai. ..
1> calibsample - 0 lỗi (s), 0 cảnh báo
========== Xây dựng: 1 thành công, 0 thất bại, 1 cập nhật, 0 bỏ qua == ========

Tại sao trình liên kết tạo tệp .lib và .exp lần này? Có một số tùy chọn để bật và tắt nó mà tôi kích hoạt mà không biết về nó?

Trả lời

16

Hơi trễ một chút nhưng có thể ai đó khác có thể tìm thấy gợi ý hữu ích này.

BTW Tôi không phải là một C++ guru ...

Trong giải pháp của tôi, tôi có 3 dự án. Một là một dự án dll, những người khác là hai dự án ứng dụng Win32 tham chiếu dự án dll.

Thông thường, với dll của bạn được xây dựng, bạn cũng có một số tệp khác được tạo (.exp, .lib) cũng cho các dự án dll NON. Điều này có thể xảy ra khi bạn bao gồm tệp .h của dự án dll, vào dự án ứng dụng, trong đó có một lớp được đánh dấu bằng __declspec (dllexport).

Để tránh người liên kết nghĩ rằng bạn đang cố gắng bao gồm một số.h tệp để "xuất" sử dụng biểu thức có điều kiện để xác định macro _declspec của bạn.

Ví dụ:

#if defined(_DO_NOT_EXPORT) 
#define DllExport 
#else 
#define DllExport __declspec(dllexport) 
#endif 

Ok, giả sử bạn có một MyClass.h trong dự án dll của bạn.

trong file .h của bạn, bạn có thể có bây giờ:

class DllExport MyClass { 
... 
} 

Khi bạn muốn bao gồm tập tin .h này thành một dự án dll NON, bạn phải chỉ đơn giản là để xác định tình trạng _DO_NOT_EXPORT

#define _DO_NOT_EXPORT 
#include "MyClass.h" 
+0

Cảm ơn rất nhiều về đầu vào này! – neuviemeporte

+1

Ồ vâng, tôi quên làm điều này trong dự án của tôi ... cảm ơn cho câu trả lời –

+0

tốt đẹp! thật hữu ích. – Yves

2

Điều này là bình thường nếu một hoặc nhiều hàm được/xuất từ ​​tệp thực thi của bạn.

+0

Có nghĩa là gì, để xuất các hàm từ một tệp thực thi? – neuviemeporte

+0

Cũng giống như bạn xuất các hàm từ một DLL, bạn cũng có thể xuất chúng từ một tệp thực thi. –

+1

Tôi không thể thấy cách thực thi của tôi là xuất bất kỳ chức năng nào. Nó chứa toàn bộ chính(). – neuviemeporte

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