6

可能重复:
Windows 和 C++:extern 和 __declspec(dllimport)
为什么/何时不需要 __declspec(dllimport)?

我想写一个DLL项目。该项目包括几个 DLL。他们是依赖的。我定义了一些宏,如下所示:

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

我为每个模块定义了 MYDLL_DECL1...MYDLL_DECLn 。因为我认为如果我定义相同的宏,它就行不通。但我真的只想定义一个宏,我写了一个测试台。我有两个模块。在第二个模块的源文件中。我编写如下代码:

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

如果我使用相同的宏名称“MYDLL_DECL”,对于model1的头文件我定义了“MYDLL_DECL”,所以“DLL_DECL”等于“__declspec(dllexport)”。实际上在 module2 中它应该等于“__declspec(dllimport)”,因为 module2 导入 module1。 但是当我为两个模块定义相同的宏时,我发现它起作用了。而且我还发现 OpenCV 也将这种方法用于其库

4

1 回答 1

6

首先,想想没有宏你需要什么。如果在 module1 中定义了一个类或函数,则需要 __declspec(dllexport)在 module1 以及__declspec(dllimport)所有其他模块中声明它。包括在声明它的头文件中。

由于您不想维护两个不同的头文件,并且您不想到处进行条件编译,因此最好的解决方案是使用条件定义的宏,例如:

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

调用编译器时,只MODULE1在项目中定义module1;您没有在任何其他项目中定义它。因此,当编译 module1 时,MODULE1_DECL展开为__declspec(dllexport),而在编译任何其他模块时,它展开为__declspec(dllimport).

于 2012-07-23T07:45:27.747 回答