首页 文章

__declspec(dllexport)做什么,在导入函数之前添加它[复制]

提问于
浏览
5

可能重复: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 回答

  • 5

    首先,在没有宏的情况下思考你需要什么 . 如果在module1中定义了类或函数,则需要在module1中声明它 __declspec(dllexport) ,在所有其他模块中声明 __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) .

相关问题