2012-07-23 60 views
5

thể trùng lặp:
Windows & C++: extern & __declspec(dllimport)
Why/when is __declspec(dllimport) not needed?những gì hiện __declspec (dllexport) làm, khi thêm nó trước khi một chức năng nhập khẩu

Tôi muốn viết một dự án DLL. Dự án này bao gồm một số DLL. Chúng là phụ thuộc. Tôi xác định một số macro như sau:

#ifdef MYDLL_DECL1 
    #define DLL_DECL __declspec(dllexport) 
#else 
    #define DLL_DECL __declspec(dllimport) 
#endif 

tôi xác định MYDLL_DECL1 ... MYDLL_DECLn cho mỗi module. Bởi vì tôi nghĩ nếu tôi xác định cùng một macro mà nó sẽ không hoạt động. Nhưng tôi thực sự muốn xác định chỉ một macro, và tôi đã viết một testbed. Tôi có hai mô-đun. Trong tệp nguồn của moudle thứ hai. Tôi viết mã như sau:

#define MYDLL_DECL 
#include "moudle1.h" 
#include "moudle2.h" 

Nếu tôi sử dụng tên macro cùng "MYDLL_DECL", đối với tệp đầu modle1 của tôi đã xác định "MYDLL_DECL", vì vậy "DLL_DECL" bằng '__declspec (dllexport)'. Trên thực tế trong module2 nó phải bằng "__declspec (dllimport)", Bởi vì module2 import module1. Nhưng tôi thấy nó hoạt động khi tôi chỉ định nghĩa một macro tương tự cho hai mô-đun. Và tôi cũng thấy rằng OpenCV cũng sử dụng methold này vào thư viện của nó

+2

... Cái gì ?? Bạn có thể sử dụng '__declspec (dllimport)' trực tiếp mà không cần phải xác định macro của riêng bạn! –

+4

http://stackoverflow.com/questions/4489441/why-when-is-declspec-dllimport-not-needed – Mohammad

+0

__declspec (dllimport) là một bộ định danh của C/C++. Vì vậy, tôi có thể sử dụng – Samuel

Trả lời

5

Trước tiên, hãy nghĩ về những gì bạn cần mà không cần macro. Nếu một lớp hoặc hàm được xác định trong mô-đun1, bạn cần khai báo nó __declspec(dllexport) trong mô-đun1 và __declspec(dllimport) trong tất cả của các mô-đun khác. Bao gồm trong tệp tiêu đề ở đó nó được tuyên bố là .

Vì bạn không muốn duy trì hai tập tin tiêu đề khác nhau, và bạn không gì có điều kiện biên soạn khắp nơi, giải pháp tốt nhất là sử dụng một macro có điều kiện xác định, ví dụ:

#ifdef MODULE1 
#define MODULE1_DECL __declspec(dllexport) 
#else 
#define MODULE1_DECL __declspec(dllimport) 
#endif 

Khi gọi trình biên dịch, bạn chỉ xác định MODULE1 trong dự án mô-đun1; bạn không định nghĩa nó trong bất kỳ dự án nào khác. Vì vậy, khi biên soạn module1, MODULE1_DECL mở rộng thành __declspec(dllexport) và khi biên dịch bất kỳ mô-đun nào khác, nó sẽ mở rộng thành __declspec(dllimport).

+0

Nó cũng cần phải xác định MODULE1 ... MODULEn. Tôi chỉ muốn xác định chỉ một macro. Tôi xác định một macro cho tất cả các mô-đun. Và nó hoạt động. Bởi vì tôi thấy rằng khi tôi muốn nhập các dll khác. Tôi không cần specifier __declspec (dllimport). – Samuel

+0

Xin chào James Kanze, bạn có thể giúp tôi mở lại câu hỏi này không. Tôi đã sửa đổi câu hỏi của mình. Hiện tại, nó không giống như http://stackoverflow.com/questions/2288293/windows-c-extern-declspecdllimport và http://stackoverflow.com/questions/4489441/why-when-is-declspec-dllimport-not-needed – Samuel

+0

@Samuel Tôi không biết làm thế nào diễn đàn này hoạt động, ngoại trừ những điều tự ý xảy ra, vì một số lý do không hợp lý. Tất cả những gì tôi có thể nói là nếu bạn không sử dụng specifier '__declspec (dllimport)', và các ký hiệu được nhập từ một đơn vị dịch khác, bạn có hành vi không xác định. Nó có thể làm việc, đối với một số loại biểu tượng, nhưng bạn không thể tin tưởng vào nó. –

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