我正在尝试学习构建库和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;
}
我也试过给他们不同的导出名称,但这也不起作用。
答案 0 :(得分:2)
在operator <<
之前声明DummyClass
的{{1}}并明确导出。
名称查找规则意味着可以在编译期间找到该函数,但由于该函数实际上不是该类的成员,因此它不会作为该类的一部分导出,因此链接失败。
或者,不要将它变成朋友,而是将其作为成员方法。