【问题标题】:C++/CLI wrapper can't use vector from native C++ dllC++/CLI 包装器不能使用来自本机 C++ dll 的向量
【发布时间】:2019-03-01 08:06:15
【问题描述】:

我有一个这样的项目:C++ -> C++/CLI 包装器 -> C# 应用程序。

我在 C++ dll 中有一个名为Drawing导出类,.h 包含一个static std::vector<void*>,向量在 .cpp 文件中定义

问题是我收到以下错误:

Errors

C++ 的本机 dll .lib 文件链接到包装器,通常包装器可以与其他东西一起使用,但是一旦我添加了 std::vector,它就会开始引发链接器错误。

我尝试在 C++ dll 中创建一个以 void* 为参数的函数并“内部”添加到列表中,但我仍然遇到相同的错误:

Errors

感谢任何形式的帮助

【问题讨论】:

  • 我怀疑签名有问题。您导出了符号 std::vector<void*>,而链接器需要 std::vector<void*, ALLOCATOR>。也许解决方案是将向量包装成更简单的非模板结构?
  • 标准 C++ 错误,您声明了静态成员但没有定义它们。谷歌“c++ 静态成员定义”查找命中,第一个是不错的。
  • @Hans Passant,正如我所提到的,我在 .cpp 文件中定义了它。
  • @woockashek,如何将向量包装到非模板结构中?

标签: c++ c++-cli linker-errors


【解决方案1】:

回答扩展我的评论。
您可以尝试将std::vector<void*> 包装成具有您真正需要的功能的更简单的结构,如下所示:

class YourClass
{
private:
    std::vector<void*> _vec;

public:
    // implement functionalities you need
    void add(void* elem)
    {
        _vec.add(elem);
    }
    // etc.
};

或通过继承:

class YourClass : public std::vector<void*>
{
public:
    YourClass(int size)
    : std::vector<void*>(size) {}
};

【讨论】:

  • 我尝试了一些类似的东西,但由于它不是静态的并且我正在导出整个类(使用 declspec(dllexport)),我必须在我的包装器中执行以下操作:Class x = new Class(); x-&gt;Add(func.ToPointer(); 并没有'不要添加它,据我所见,我打印了向量前后的大小并添加了它,但是由于我正在做new Class(),所以我无法在我的C++ dll中使用它,因为它仍然是空的. (或者这就是我认为正在发生的事情)。
猜你喜欢
  • 1970-01-01
  • 2011-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多