代码之家  ›  专栏  ›  技术社区  ›  DeusAduro

dll和静态库的头文件相同

  •  5
  • DeusAduro  · 技术社区  · 15 年前

    因此,定义dll的导出/导入的常见方法(至少与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”)?

    3 回复  |  直到 15 年前
        1
  •  12
  •   Community Navdeep Singh    7 年前

    没有什么。

    把它当作 #define MY_API 我的_API的所有实例都将消失。

    可以添加新的生成配置,例如debug-dll和release-dll,它们模拟其他配置,但它们除外 #define DLL_CONFIG .

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

    为此,转到ProjtProjks:gt;配置属性-gt/c+c++gt;预处理器和类型。 DLLY-CONFIG 在那里。你也会看到这就是 NDEBUG WIN32 定义。

    喜欢 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
  •  3
  •   haffax    15 年前

    只需将我的_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_CONFIG 如果他们想使用它作为一个动态链接库,或者不定义它,如果他们想使用它作为一个静态库。 不会有任何问题。这种配置在许多库中完成。

    编辑:当然你不应该用这些名字 MY_EXPORTS DLLY-CONFIG 像这样的。对所有宏使用特定于项目的前缀,这样就不会出现名称冲突。

        3
  •  1
  •   ralphtheninja    15 年前

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