C++ 在导入函数之前添加declspec(dllexport)时,它做什么

C++ 在导入函数之前添加declspec(dllexport)时,它做什么,c++,c,dll,opencv,C++,C,Dll,Opencv,可能重复: 我想写一个DLL项目。这个项目包括几个DLL。它们是依赖的。我定义了一些宏,如下所示: #ifdef MYDLL_DECL1 #define DLL_DECL __declspec(dllexport) #else #define DLL_DECL __declspec(dllimport) #endif 我为每个模块定义了MYDLL\u DECL1…MYDLL\u DECLn。因为我想如果我定义同一个宏,它就不会工作。但我真的只想定义一个宏,我编写了一个测

可能重复:

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

#ifdef  MYDLL_DECL1
    #define  DLL_DECL __declspec(dllexport)
#else
    #define DLL_DECL __declspec(dllimport)
#endif
我为每个模块定义了MYDLL\u DECL1…MYDLL\u DECLn。因为我想如果我定义同一个宏,它就不会工作。但我真的只想定义一个宏,我编写了一个测试平台。我有两个模块。在第二个moudle的源文件中。我编写如下代码:

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

如果我使用相同的宏名“MYDLL_DECL”,那么对于modle1的头文件,我已经定义了“MYDLL_DECL”,因此“DLL_DECL”等于“\uu declspec(dllexport)”。实际上,在模块2中,它应该等于“u declspec(dllimport)”,因为模块2导入模块1但是当我为两个模块定义一个相同的宏时,我发现它是有效的。我还发现OpenCV也使用这种方法来访问它的库

首先,考虑一下没有宏时需要什么。如果是一个类或 函数是在module1中定义的,您需要声明它 模块1中的
\u declspec(dllexport)
,以及所有模块中的
\u declspec(dllimport)
其他模块的。包括在其所在的头文件中 声明

因为您不想维护两个不同的头文件 不要什么条件编译到处都是,最好的解决办法 是否使用有条件定义的宏,例如:

#ifdef MODULE1
#define MODULE1_DECL __declspec(dllexport)
#else
#define MODULE1_DECL __declspec(dllimport)
#endif
调用编译器时,您仅在项目中定义
MODULE1
模块1;您不会在任何其他项目中定义它。所以在编译的时候 模块1,
module1\u DECL
扩展为
\u declspec(dllexport)
,以及何时
在编译任何其他模块时,它将扩展到
\uu declspec(dllimport)

。。。什么??您可以直接使用
\uu declspec(dllimport)
,而无需定义自己的宏__declspec(dllimport)是C/C++的说明符。所以我可以用你是在问宏,还是关于
\uu declspec(dllimport)
?如果你想问这两个问题,那么你应该把这两个问题分开,实际上我想问这两个问题。我已经详细说明了它们。对不起,我的池表达式还需要定义MODULE1…MODULEn。我只想定义一个宏。我为所有模块定义了一个宏。因为我发现当我想导入其他DLL时。我不需要说明符declspec(dllimport)。嗨,詹姆斯·坎兹,你能帮我重新开始这个问题吗。我修改了我的问题。现在它和@Samuel不一样了,我不知道这个论坛是怎么运作的,只是因为一些非理性的原因,事情随意发生了。我所能说的是,如果您不使用说明符
\uu declspec(dllimport)
,并且符号是从另一个翻译单元导入的,那么您有未定义的行为。对于某些类型的符号,它可能会起作用,但你不能指望它。