gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 13:27:52 26 4
gpt4 key购买 nike

因此,为 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com