c++ - DLL 和静态库的头文件相同

标签 c++ windows

因此,为 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”)?

最佳答案

没有。

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

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

要克隆配置,请进入配置管理器(如调试/发布列表框的下拉列表),然后在“事件解决方案配置”下选择新的。您现在可以将其命名为“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 用户正在使用 DLL 版本,则他们只需#define THEPROJECT_USE_DLL,就像您的“- DLL”配置一样。

关于c++ - DLL 和静态库的头文件相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1089828/

相关文章:

windows - 最大线程数

c++ - 由于 'Library not loaded' 'image not found' 导致 eclipse mac 安装 boost 错误

for_each 中的 C++ 仿函数意外行为

windows - Windows 批处理脚本打开文件选择器对话框或将文件拖放到其中

C++ 在 Windows 中播放音频

c# - 指定机器名时无法在自己的机器上查询SystemIndex

c - MinGW中没有fopencookie或fmemopen吗?

c++ - 使用局部全局变量在单独的线程中运行 C 函数

c++ - 使用给定的哈希函数查找冲突字符串

c++ - 使用 __declspec 的内存填充问题