【发布时间】:2015-03-01 19:40:59
【问题描述】:
该项目具有以下结构: 1. DLL - 具有核心逻辑和类层次结构 2. exe - 处理命令行并启动算法的控制台应用程序 3. Dll - 测试,就像一个单元测试套件 - 硬编码填充来自第一个 Dll 的 ojects 集合并将集合传递给 exe 控制台进行处理
所以 Dll 点 3 应该返回集合(例如 std::list),集合包含多态对象,然后应该存储指针, 我更喜欢使用 std::unique_ptr 而不是原始指针
我看到 unique_ptr 仅支持移动语义,我正在使用 emplace_back 成员填充列表。 但是从与 MSVC 类导出技术相关的 Dll 中返回 std::list> 集合存在问题
如果我理解正确: 在 dll 和 exe 项目之间共享的项目标头应该包含类似这样的内容,其中 EXP_DLL 应该为 Dll 定义而为 exe 未定义
#ifdef EXP_STL
# define DECLSPECIFIER __declspec(dllexport)
# define EXPIMP_TEMPLATE
#else
# define DECLSPECIFIER __declspec(dllimport)
# define EXPIMP_TEMPLATE extern
#endif
EXPIMP_TEMPLATE template class DECLSPECIFIER std::list<std::unique_ptr<MyBassClass>>;
std::list<std::unique_ptr<MyBassClass>> DECLSPECIFIER make_test_array();
这个定义:
EXPIMP_TEMPLATE template class DECLSPECIFIER std::list<std::unique_ptr<MyBassClass>>;
引发错误
C2280:std::unique_ptr>::unique_ptr(const std::unique_ptr<_ty>> &)' :试图 引用已删除的函数
我看到尝试调用 unique_ptr 的复制 ctor(当然,已删除)
您能否为我澄清这些问题:
- 这个实例化模板的导出声明如何在这里调用复制ctor?
- 您能建议如何避免这种情况的解决方案吗?
【问题讨论】:
-
从 DLL 中传递动态分配内存的所有权可能有点危险。我记得微软的编译器做了一些魔法让它工作,但更一般地说,我认为自定义分配器是必要的。
-
您能解释一下将逻辑放在 DLL 中而不是在静态库中的原因吗?
-
没有道理,只是用户的要求。我必须在分离的 Dll 中填充测试结构。附言当然,这不是一个生产项目,只是一个示例
-
您不应从 DLL 导出 C++ API。这会导致很多问题。
标签: c++ visual-c++ dll