在每个 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=],如下所述。