可能重复:
Windows和C++:extern&__ declspec(dllimport)
为什么/何时不需要__declspec(dllimport)?
我想写一个DLL项目.该项目包括几个DLL.他们是依赖的.我定义了一些宏如下:
#ifdef MYDLL_DECL1
#define DLL_DECL __declspec(dllexport)
#else
#define DLL_DECL __declspec(dllimport)
#endif
Run Code Online (Sandbox Code Playgroud)
我为每个模块定义了MYDLL_DECL1 ... MYDLL_DECLn .因为我认为如果我定义相同的宏,它将无法正常工作.但我真的只想定义一个宏,我写了一个测试平台.我有两个模块.在第二个moudle的源文件中.我写代码如下:
#define MYDLL_DECL
#include "moudle1.h"
#include "moudle2.h"
Run Code Online (Sandbox Code Playgroud)
如果我使用相同的宏名称"MYDLL_DECL",对于modle1的头文件,我已经定义了"MYDLL_DECL",因此"DLL_DECL"等于'__declspec(dllexport)'.实际上在module2中它应该等于"__declspec(dllimport)",因为module2导入module1. 但是当我为两个模块定义一个相同的宏时,我发现它有效.我还发现OpenCV也将这种方法用于其库
首先,在没有宏的情况下思考你需要什么.如果在module1中定义了类或函数,则需要__declspec(dllexport)在module1和__declspec(dllimport)所有其他模块中声明它
.包括在声明它的头文件中.
由于您不想维护两个不同的头文件,并且您没有在任何地方进行条件编译,因此最佳解决方案是使用有条件定义的宏,例如:
#ifdef MODULE1
#define MODULE1_DECL __declspec(dllexport)
#else
#define MODULE1_DECL __declspec(dllimport)
#endif
Run Code Online (Sandbox Code Playgroud)
在调用编译器时,只MODULE1在项目module1中定义; 你没有在任何其他项目中定义它.因此,在编译module1时,MODULE1_DECL展开到__declspec(dllexport),以及在编译任何其他模块时,它会扩展为__declspec(dllimport).
| 归档时间: |
|
| 查看次数: |
3815 次 |
| 最近记录: |