【问题标题】:Same Header File for both DLL and Static LibraryDLL 和静态库的头文件相同
【发布时间】:2009-07-07 08:43:15
【问题描述】:

因此,为 DLL 定义导出/导入的常用(至少 VS 2005 状态)方法是:

#ifdef MY_EXPORTS
#define MY_API __declspec(dllexport)
#else
#define MY_API __declspec(dllimport)
#endif

class MY_API MyClass {
    ...
};

如果我只是将代码构建为 DLL,这将非常有用。但是,我想选择使用静态库或 DLL。现在一个明显(但很糟糕)的解决方案是复制所有代码,删除 DLL 'MY_API' 定义。现在看起来更好的方法是使用命令行开关来定义或不定义 DLL 的东西。但是在静态库的情况下,“MY_API”应该是什么?

#ifdef DLL_CONFIG
    #ifdef MY_EXPORTS
    #define MY_API __declspec(dllexport)
    #else
    #define MY_API __declspec(dllimport)
    #endif
#else
    #define MY_API // What goes here?
#endif

class MY_API MyClass {
    ...
};

现在假设可以做到这一点,当库的用户包含头文件时会出现问题(即他们是否必须定义“DLL_CONFIG”)?

【问题讨论】:

    标签: c++ windows


    【解决方案1】:

    什么都没有。

    将其保留为#define MY_API,MY_API 的所有实例都会消失。

    您可以添加新的构建配置,例如 Debug - DLL 和 Release - DLL,它们模仿除了 #define DLL_CONFIG 之外的其他配置。

    要克隆配置,请进入配置管理器(如调试/发布列表框的下拉菜单),然后在“活动解决方案配置”下选择新建。您现在可以将其命名为“Debug - DLL”并将Copy Settings 设置为Debug,现在剩下要做的就是定义DLL_CONFIG

    为此,请转到项目属性->配置属性->C/C++->预处理器,然后在其中键入DLL_CONFIG。您还将看到 NDEBUGWIN32 之类的定义。

    haffax said,使用项目特定的名称。我会推荐类似的东西:

    #ifdef THEPROJECT_USE_DLL
        #ifdef THEPROJECT_BUILDING_PROJECT
            #define THEPROJECT_API __declspec(dllexport)
        #else
            #define THEPROJECT_API __declspec(dllimport)
        #endif
    #else
        #define THEPROJECT_API
    #endif
    

    现在您的 DLL 的用户只需 #define THEPROJECT_USE_DLL 如果他们正在使用 DLL 版本,就像您的“-DLL”配置一样。

    【讨论】:

      【解决方案2】:

      只需将 MY_API 定义为空。像这样:

      #ifdef DLL_CONFIG
          #ifdef MY_EXPORTS
          #define MY_API __declspec(dllexport)
          #else
          #define MY_API __declspec(dllimport)
          #endif
      #else
          #define MY_API
      #endif
      

      如果是静态链接,则不需要 declspec。

      如果您的库的用户想要将其用作 dll,则必须定义 DLL_CONFIG,如果他们想要将其用作静态库,则必须不定义它。 不会有任何问题。这种配置在很多库中都完成了。

      编辑:当然,您不应该这样使用名称MY_EXPORTSDLL_CONFIG。为所有宏使用项目特定的前缀,以免名称冲突。

      【讨论】:

        【解决方案3】:

        什么都不做。链接静态库不需要特殊的调用约定。您唯一需要做的就是确保链接器与 your.lib 链接。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-17
          • 2020-07-07
          • 1970-01-01
          • 2010-10-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-02-23
          相关资源
          最近更新 更多