2011-01-10 36 views
5

Tôi cố gắng để viết một dll, đây là cách nhìn tập tin tiêu đề của tôi:Sử dụng dllimport thủ tục

#ifndef _DLL_H_ 
#define _DLL_H_ 

#if BUILDING_DLL 
# define DLLIMPORT __declspec (dllexport) 
#else /* Not BUILDING_DLL */ 
# define DLLIMPORT __declspec (dllimport) 
#endif /* Not BUILDING_DLL */ 


DLLIMPORT void HelloWorld (void); 


#endif /* _DLL_H_ */ 

Trong tập tin cpp tôi bao gồm tập tin tiêu đề này, và tôi cố gắng tuyên bố một thủ tục nhập khẩu theo cách này dll :

DLLIMPORT void HelloWorld() 
{ 
    MessageBox (0, "Hello World from DLL!n", "Hi", MB_ICONINFORMATION); 
} 

Nhưng trình biên dịch (tôi đã mingw32 trên windows 7 64 bit) tiếp tục đem lại cho tôi lỗi này:

E:\Cpp\Sys64\main.cpp|7|error: function 'void HelloWorld()' definition is marked dllimport| 
E:\Cpp\Sys64\main.cpp||In function 'void HelloWorld()':| 
E:\Cpp\Sys64\main.cpp|7|warning: 'void HelloWorld()' redeclared without dllimport attribute: previous dllimport ignored| 
||=== Build finished: 1 errors, 1 warnings ===| 

Và tôi không hiểu tại sao.

+0

Tôi đã hợp nhất hai tài khoản của bạn để bạn có thể chấp nhận câu trả lời ngay bây giờ. –

Trả lời

3

declspec(dllimport) tạo mục nhập trong bảng nhập mô-đun của mô-đun. Bảng nhập này được sử dụng để phân giải các tham chiếu đến các ký hiệu tại thời gian liên kết. Tại thời điểm tải, các tham chiếu này được cố định bởi bộ nạp.

Các declspec(dllexport) tạo ra các mục trong bảng xuất DLL của DLL. Hơn nữa, bạn cần phải thực hiện các biểu tượng (hàm, biến) được khai báo với nó.

Vì bạn triển khai DLL, bạn phải xác định BUILDING_DLL. Điều này có thể được thực hiện với #define nhưng điều này sẽ được thiết lập tốt hơn trong cài đặt dự án.

+1

Hoặc vượt qua '/ D BUILDING_DLL' vào trình biên dịch (mà tôi tin là tùy chọn phổ biến hơn) – MSalters

+0

Bạn nói đúng. Đã thêm câu trả lời này vào câu trả lời. – harper

2

Tôi đã gặp lỗi chính xác trước khi nhận ra rằng tôi đã không thực sự xác định BUILDING_DLL.

Do đó, DLLIMPORT được định nghĩa là __declspec (dllimport) và không được __declspec (dllexport) như dự định. Sau khi tôi xác định biểu tượng, vấn đề đã được giải quyết.

Kể từ khi bạn đang ở trên MinGW, bạn cần phải vượt qua những điều sau đây:

-DBUILDING_DLL 

như một tùy chọn biên dịch, hoặc chỉ cần thêm

#define BUILDING_DLL 

ở phía trên cùng của tập tin của bạn. Trước đây là tốt hơn, chỉ sử dụng giải pháp #define nếu bạn không thể tìm ra cách chuyển tùy chọn -DBUILDING_DLL thành gcc.

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