Visual Studio 2015编译器 自动生成 XXX_EXPORTS宏

XXX_EXPORTS宏

XXX_EXPORTS宏是由Visual Studio 2015编译器自动生成的。这个宏用于标识当前项目是一个导出符号的动态链接库(DLL)项目。在使用Visual Studio 2015创建Win32项目时,编译器会自动添加这个宏到项目的预定义宏中。

这个宏的作用是在编译过程中帮助标识导出符号,以便在动态链接库中正确地导出和导入函数和变量。通过使用这个宏,可以确保在编译和链接过程中正确处理动态链接库的导出和导入。

如果你使用Visual Studio 2015创建了一个Win32项目,并且看到了XXX_EXPORTS宏,那么你可以在代码中使用它来标识需要导出的函数和变量。例如,在导出函数时,可以使用宏来定义函数的导出修饰符。

请注意,这个宏的名称可能会因为项目的不同而有所变化,例如XXX_EXPORTS宏可能会根据项目名称和项目类型而有所不同。因此,如果你在不同的项目中使用Visual Studio 2015创建项目,可能会看到不同的宏名称。

要在编译和链接过程中正确处理动态链接库的导出和导入,可以使用这个宏来标识需要导出的函数和变量,并使用适当的导出修饰符。

在使用Visual Studio 2015创建的Win32项目中,可以按照以下步骤来使用这个宏:

  1. 在需要导出的函数和变量的声明前添加宏定义。例如:
#ifdef XXX_EXPORTS
#define XXX_API __declspec(dllexport)
#else
#define XXX_API __declspec(dllimport)
#endif

XXX_API void MyExportedFunction();
  1. 在需要导出的函数和变量的定义处使用宏。例如:
XXX_API void MyExportedFunction()
{
    // 函数实现
}
  1. 在项目的属性设置中,确保已正确配置导出符号。可以按照以下步骤进行设置:
  • 右键单击项目,选择“属性”。
  • 在属性页中,选择“配置属性” > “C/C++” > “预处理器”。
  • 在“预处理器定义”一栏中,添加宏定义XXX_EXPORTS。

这样,在编译和链接过程中,编译器会根据宏的定义来正确处理导出和导入符号。在生成动态链接库时,导出的函数和变量将被标记为可供其他模块使用。在使用动态链接库的其他项目中,可以使用相同的宏来导入这些函数和变量。

__declspec(dllexport) 和 __declspec(dllimport) 的区别

__declspec(dllexport)和__declspec(dllimport)是用于在Windows平台上定义动态链接库(DLL)中的函数和变量的关键字。

__declspec(dllexport)用于在DLL中定义函数或变量,并将其标记为可供其他模块使用。这将使函数或变量在DLL中可见,并可以被其他模块调用或引用。

__declspec(dllimport)用于在使用DLL的模块中声明函数或变量。它告诉编译器该函数或变量是在DLL中定义的,并且在链接时需要从DLL中导入。

因此,__declspec(dllexport)用于定义DLL中的函数或变量,而__declspec(dllimport)用于在使用DLL的模块中声明函数或变量。

需要注意的是,这些关键字只在Windows平台上有效,并且在其他平台上没有相应的等效物。

MSDN里面的解释:
不使用 __declspec(dllimport) 也能正确编译代码,但使用 __declspec(dllimport) 使编译器可以生成更好的代码。编译器之所以能够生成更好的代码,是因为它可以确定函数是否存在于 DLL 中,这使得编译器可以生成跳过间接寻址级别的代码,而这些代码通常会出现在跨 DLL 边界的函数调用中。但是,必须使用 __declspec(dllimport) 才能导入 DLL 中使用的变量。


dllimport是为了更好的处理类中的静态成员变量的,如果没有静态成员变量,那么这个__declspec(dllimport)无所谓!!!!!!!

导出dll中的函数为什么要加extern “C”

在C++中,函数的名称会被编译器进行名称修饰(name mangling),以便支持函数重载和其他C++特性。这种名称修饰会导致函数在编译后的二进制代码中的名称发生变化。

当我们将函数导出为动态链接库(DLL)时,我们希望函数的名称在二进制代码中保持不变,以便其他程序可以正确地调用这些函数。为了实现这一点,我们需要使用extern "C"语法来告诉编译器不要对函数名称进行修饰。

extern "C"告诉编译器使用C语言的命名约定来处理函数名称,这样函数的名称就不会被修饰,而是保持原样。这样,其他程序就可以按照C语言的方式来调用这些函数,而不需要关心C++的名称修饰。

因此,当我们将函数导出为DLL时,为了确保函数的名称在二进制代码中保持不变,我们需要使用extern "C"来告诉编译器不要对函数名称进行修饰。

总结:dll库中统一引用的头文件(UserDllDef.h)

#ifndef _USER_DLL_DEF_H_
#define _USER_DLL_DEF_H_

#ifndef USER_EXTERN_C
#if (defined(__cplusplus) || defined(__cplusplus__))
#define USER_EXTERN_C extern "C"
#else
#define USER_EXTERN_C
#endif // __cplusplus || __cplusplus__
#endif // USER_EXTERN_C


#ifdef XXX_EXPORTS
#if defined(_WIN32)
#define XXX_API  USER_EXTERN_C __declspec(dllexport)
#else
#define XXX_API  USER_EXTERN_C __attribute__((visibility("default")))
#endif
#else
#if defined(_WIN32)
#define XXX_API  USER_EXTERN_C __declspec(dllimport)
#else
#define XXX_API  USER_EXTERN_C __attribute__((visibility("default")))
#endif
#endif // XXX_EXPORTS

#endif // _USER_DLL_DEF_H_

你可能感兴趣的:(宏,c++,ide)