因此,为 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
。您还会看到 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 用户正在使用 DLL 版本,则他们只需#define THEPROJECT_USE_DLL
,就像您的“- DLL”配置一样。
关于c++ - DLL 和静态库的头文件相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1089828/