可能重复:Windows&C:extern&__ declspec(dllimport)为什么/何时不需要__declspec(dllimport)?
我想写一个DLL项目 . 该项目包括几个DLL . 他们是 dependent . 我定义了一些宏如下:
#ifdef MYDLL_DECL1
#define DLL_DECL __declspec(dllexport)
#else
#define DLL_DECL __declspec(dllimport)
#endif
我为 each modules 定义了MYDLL_DECL1 ... MYDLL_DECLn . 因为我认为如果我定义相同的宏它不会_703339的源文件 . 我写的代码如下:
#define MYDLL_DECL
#include "moudle1.h"
#include "moudle2.h"
如果我使用相同的宏名称"MYDLL_DECL",对于modle1 's head file I have defined 703342 , so 703343 is equal to ' __declspec(dllexport)' . 实际上在module2中它应该等于"__declspec(dllimport)",因为module2导入module1 . But I found it worked when I just define a same macro for two module. And I also find that the OpenCV also use this methold to its library
1 回答
首先,在没有宏的情况下思考你需要什么 . 如果在module1中定义了类或函数,则需要在module1中声明它
__declspec(dllexport)
,在所有其他模块中声明__declspec(dllimport)
. 包括在声明它的头文件中 .由于您不想维护两个不同的头文件,并且您没有在任何地方进行条件编译,因此最佳解决方案是使用有条件定义的宏,例如:
调用编译器时,只在项目module1中定义
MODULE1
;你没有在任何其他项目中定义它 . 因此,在编译module1时,MODULE1_DECL
扩展为__declspec(dllexport)
,并且在编译任何其他模块时,它会扩展为__declspec(dllimport)
.