在每个 public 方法之前使用 `__declspec(dllexport)`
using `__declspec(dllexport)` before every public method
我在 VS2017 的 C++ 工作区中工作,工作区中有两个项目:一个实用程序项目和一个使用该实用程序项目的主项目。
在我向实用程序项目添加新的 class(“.h”和“.cpp”文件)后,我注意到尽管我对代码进行了更改,但“.lib”文件是在构建它时不会重写,除非我更改声明包含 __declspec(dllexport)
的方法。看来我必须添加这个声明,否则,派生的问题当然是主项目有链接错误。
有没有比在每个 public 方法的声明前添加 __declspec(dllexport)
更优雅的方法,如下面的代码所示?
public:
__declspec(dllexport) MyProperty(const std::string &csvLine);
__declspec(dllexport) bool getIsActive();
__declspec(dllexport) std::string getFormatting();
__declspec(dllexport) PropertyType getType();
您可以将声明添加到 class,而不是单独的方法:
class __declspec(dllexport) MyProperty
{
public:
MyProperty(const std::string &csvLine);
bool getIsActive();
std::string getFormatting();
PropertyType getType();
};
请注意,对于 class,该位置与方法略有不同 - 不是在完整声明的前面,而是在 class
关键字和 class 名称之间。
作为后续,通常使用一个宏来代替,它被定义为 __declspec(dllexport)
或 __declspec(dllimport)
,这取决于一些预处理器条件指定我们当前是在编译 dll 还是试图使用它:
#if defined(MY_DLL)
#define MY_DLL_API __declspec(dllexport)
#else
#define MY_DLL_API __declspec(dllimport)
#endif
class MY_DLL_API MyProperty
{
public:
MyProperty(const std::string &csvLine);
bool getIsActive();
std::string getFormatting();
PropertyType getType();
};
对于你的 dll 项目,然后你定义 MY_DLL
,对于每个只使用 dll 的人(没有定义 MY_DLL
),header 将自动具有所需的 dllimport .
重要提示:不建议跨 DLL 边界传递大多数 STL 类型,例如参见 [=17=],如下所述。
我在 VS2017 的 C++ 工作区中工作,工作区中有两个项目:一个实用程序项目和一个使用该实用程序项目的主项目。
在我向实用程序项目添加新的 class(“.h”和“.cpp”文件)后,我注意到尽管我对代码进行了更改,但“.lib”文件是在构建它时不会重写,除非我更改声明包含 __declspec(dllexport)
的方法。看来我必须添加这个声明,否则,派生的问题当然是主项目有链接错误。
有没有比在每个 public 方法的声明前添加 __declspec(dllexport)
更优雅的方法,如下面的代码所示?
public:
__declspec(dllexport) MyProperty(const std::string &csvLine);
__declspec(dllexport) bool getIsActive();
__declspec(dllexport) std::string getFormatting();
__declspec(dllexport) PropertyType getType();
您可以将声明添加到 class,而不是单独的方法:
class __declspec(dllexport) MyProperty
{
public:
MyProperty(const std::string &csvLine);
bool getIsActive();
std::string getFormatting();
PropertyType getType();
};
请注意,对于 class,该位置与方法略有不同 - 不是在完整声明的前面,而是在 class
关键字和 class 名称之间。
作为后续,通常使用一个宏来代替,它被定义为 __declspec(dllexport)
或 __declspec(dllimport)
,这取决于一些预处理器条件指定我们当前是在编译 dll 还是试图使用它:
#if defined(MY_DLL)
#define MY_DLL_API __declspec(dllexport)
#else
#define MY_DLL_API __declspec(dllimport)
#endif
class MY_DLL_API MyProperty
{
public:
MyProperty(const std::string &csvLine);
bool getIsActive();
std::string getFormatting();
PropertyType getType();
};
对于你的 dll 项目,然后你定义 MY_DLL
,对于每个只使用 dll 的人(没有定义 MY_DLL
),header 将自动具有所需的 dllimport .
重要提示:不建议跨 DLL 边界传递大多数 STL 类型,例如参见 [=17=],如下所述。