__declspec(dllexport)在导入函数之前添加它时做了什么

Sam*_*uel 5 c c++ dll opencv

可能重复:
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也将这种方法用于其库

Jam*_*nze 5

首先,在没有宏的情况下思考你需要什么.如果在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).