c++ - 在 dll 中使用 std::list 无法解析的外部符号

标签 c++ dll stl stdlist

我正在尝试学习构建库和 DLL 的基础知识。我使用 MSVC 构建了一个简单的 DLL,并且可以通过链接在简单的控制台应用程序中使用它。

#if defined(DUMMYCLASS_EXPORT)
#define DUMMYCLASS_API __declspec(dllexport)
#else
#define DUMMYCLASS_API __declspec(dllimport)
#endif

#include <string>
#include <list>

class DUMMYCLASS_API DummyClass
{
public:
    DummyClass(int id, const std::string& name);
    friend std::list<DummyClass>& operator<<(std::list<DummyClass>& dl, const DummyClass& dc);
    void ID(const int newID);
    const int ID();
    void Name(const std::string newName);
    const std::string Name();
private:
    int id;
    std::string name;
};

之后我尝试构建另一个 DLL,它依赖于我构建的第一个 DLL。下面是该新类的头文件。

#pragma once
#if defined(DUMMYWRAPPER_EXPORT)
#define DUMMYWRAPPER_API __declspec(dllexport)
#else
#define DUMMYWRAPPER_API __declspec(dllimport)
#endif

#include <list>
#include "DummyClass.h"

class DUMMYWRAPPER_API DummyWrapper
{
public:
    DummyWrapper();
    ~DummyWrapper();
    DummyWrapper& operator<<(const DummyClass& dc);
private:
    std::list<DummyClass>* dList;
};

我将 DummyClass.dll 和 .lib 添加到我的新项目中,但是当我尝试构建它时出现错误

Error   1   error LNK2001: unresolved external symbol "class
std::list<class DummyClass,class std::allocator<class DummyClass> > &
__cdecl operator<<(class std::list<class DummyClass,class std::allocator<class DummyClass> > &,class DummyClass const &)"
(??6@YAAAV?$list@VDummyClass@@V?$allocator@VDummyClass@@@std@@@std@@AAV01@ABVDummyClass@@@Z)    c:\Users\MCE\documents\visual
studio 2013\Projects\DummyWrapperDLL\DummyWrapperDLL\DummyWrapper.obj   DummyWrapperDLL

现在我不知道要搜索什么,并且我所有的搜索最终都会出现一些更简单且不相关的链接错误。我该如何解决这个问题?

编辑: 这是DummyClass.cpp

#define DUMMYCLASS_EXPORT
#include "DummyClass.h"
#include <iostream>
#include <stdio.h>

DummyClass::DummyClass(int newid, const std::string& newname)
    :id(newid), name(newname)
{
    std::cout << "Dummy Object created" << std::endl;
    std::cout << "ID: " << id << " / Name: " << name << std::endl;
}

std::list<DummyClass>& operator<<(std::list<DummyClass>& dl, const DummyClass& dc)
{
    dl.push_back(dc);
    return dl;
}

void DummyClass::ID(int newID)
{
    this->id = newID;
    std::cout << "ID changed to " << newID << std::endl;
}

const int DummyClass::ID()
{
    return this->id;
}

void DummyClass::Name(std::string newName)
{
    this->name = newName;
    std::cout << "Name changed to " << newName << std::endl;
}

const std::string DummyClass::Name()
{
    return this->name;
}

这个是DummyWrapper.cpp

#define DUMMYWRAPPER_EXPORT
#include "DummyWrapper.h"

DummyWrapper::DummyWrapper()
{
    dList = new std::list<DummyClass>;
}


DummyWrapper::~DummyWrapper()
{
    dList->clear();
    dList = nullptr;
}

DummyWrapper& DummyWrapper::operator<<(const DummyClass& dc)
{
    *dList << dc;
    return *this;
}

我还尝试给它们提供不同的导出名称,但这也不起作用。

最佳答案

声明 operator << DummyClass的之前DummyClass并显式导出它。

名称查找规则意味着可以在编译时找到该函数,但由于该函数实际上不是类的成员,因此不会作为类的一部分导出,因此链接失败。

或者,不要将其设为友元方法,而将其设为成员方法。

关于c++ - 在 dll 中使用 std::list 无法解析的外部符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32670546/

相关文章:

c++ - STL erase-remove idiom vs 自定义删除操作和valgrind

c++ - zlib compress2 返回 Z_STREAM_ERROR

c - 从共享对象文件 (.so) 获取函数返回类型和参数

C++ map<K,T> 初始化

java - 无法在 Java Applet 中将文件设置为可写

c++ - 将记录作为函数结果从 Delphi DLL 传递到 C++

c++测试2组是否不相交

c++ - 将类转换为固定长度的 float 组

c++ - 是否可以传递具有捕获的不可复制(移动)值的 lambda?

c++ - 如何在C/C++中删除当前用户的文件?