【发布时间】:2021-11-05 00:39:51
【问题描述】:
我正在使用 MSVC。而且我一直在阅读,我知道这种类型的事情是一个常见的问题,只是想弄清楚!
我有一个静态库的层次结构,即一个接口库和一个实现库。我正在尝试将它们捆绑到一个 dll 中,但在弄清楚何时应该在成员上使用 __declspec(dllexport) 时遇到问题。
例如,我有一个接口类IInstance,它位于Interface.lib中
class IInstance : public IModule
{
public:
IInstance() : IModule() {}
virtual ~IInstance() {}
static API_TYPE const ModuleCategory category;
};
另一个静态库 (System.lib) 提供了一个实现:
class DefaultInstance : public IInstance
{
public:
DefaultInstance();
~DefaultInstance();
private:
我想将这两个 .lib 链接到一个 .dll 中。 另一个不同的静态库将包含接口类的头文件。
我遇到的问题的一个例子是IInstance 中的ModuleCategory。你可以看到我有 API_TYPE 准备好成为 __declspec(dllexport) 或 __declspec(dllimport),这取决于预处理器定义,例如
#ifdef MY_PROJECT_DLL
#pragma message("Building with DLL exports" )
#define API_TYPE __declspec(dllexport)
#else
#pragma message("Building with DLL imports" )
#define API_TYPE __declspec(dllimport)
#endif
根据我的阅读,当我构建 DLL 时,我应该使用在 DLL 项目中设置的预处理器定义(例如 MY_PROJECT_DLL),但是我没有看到引用的 . lib 项目,即我在构建 DLL 时看到这样的输出:
1>------ Build started: Project: System, Configuration: Debug x64 ------
1>DefaultInstance.cpp
1>Building with DLL imports
1>Building with DLL imports
...
2>------ Build started: Project: MyNativeDLL, Configuration: Debug x64 ------
2>SomeOtherThing.cpp
2>Building with DLL exports
2>Building with DLL exports
2>Building with DLL exports
应该是这样吗?我期待看到静态库获取 dll 项目中定义的 MY_PROJECT_DLL?
编辑:
我已经开始使用定义的 MY_PROJECT_DLL 构建静态库。包含来自这些库的标头的其他库则将API_TYPE 视为__declspec(dllimport)。
一一解决未解决的外部问题,但这看起来是一个可能的解决方案
【问题讨论】:
标签: c++ visual-c++ dll linker