提问者:小点点

在两个项目之间链接时使用虚函数获取链接错误


我在一个名为ConsolApp1的项目中创建了一个基类和派生类,其中基类有几个虚拟方法和一个虚拟析构函数。这些方法都设置为纯虚拟方法,然后在派生类中定义并使用overwrite关键字覆盖。此外,派生类和基类都包装在一个命名空间中。当我创建一个名为ConsolApp2的新项目时,它位于与ConsolApp1相同的解决方案中,该解决方案实现派生类的对象链接错误出现在任何被声明为虚拟的方法或析构函数中。为了允许ConsolApp2包含派生类及其所在的命名空间,我必须添加头文件位置的路径。我很确定我这样做是正确的,因为当我尝试包含它时,头文件会显示出来。提前感谢您的帮助。

这是我遇到的问题的一些伪代码。我能够编译ConsolApp1而没有错误,但是ConsolApp2不会构建并抛出三个链接错误,两个用于虚拟方法,一个用于虚拟析构函数。编译是使用VS2012完成的。错误是:

错误LNK2001:未解析的外部符号public: Virtual int const__thiscallFoSpace::FooDerived::Get有东西(void)const(?GetSomething@FooDerived@FoSpace@@UBE?BHXZ)

错误LNK2001:未解决的外部符号"public: Virtual void__thiscallFoSpace::FooDerived::Set有东西(int)"(?SetSomething@FooDerived@FoSpace@@UAEXH@Z)

错误LNK2019:未解决的外部符号"public: Virtual__thiscallFoSpace::FooDerived::~FoDerive(void)"(??1FooDerived@FooSpace@@UAE@XZ)引用于函数"public:Virtual void*__thiscallFOSpace::FooDerived::'标量删除析构函数'(无符号int)"(??_GFooDerived@FooSpace@UAEPAXI@Z)

控制台应用1:

FooBase. h

namespace FooSpace
{
    class FooBase
    {
        public:
            FooBase(){}
            virtual ~FooBase() {}

            virtual const int GetSomething() const = 0;

            virtual void SetSomething(int f) = 0;
    };
}

美食衍生. h

#include "FooBase.h"

namespace FooSpace
{
    class FooDerived : FooBase
    {
        public:

            FooDerived() : FooBase(){}

            ~FooDerived() override;

            const int GetSomething() const override;

            void SetSomething(int f) override; 
    };
}

美食衍生. cpp

#include "FooDerived.h"

FooSpace::FooDerived::~FooDerived()
{
    //destruct an object of FooDerived
}

const int FooSpace::FooDerived::GetSomething() const
{
    int ret = 0;

    return ret;
}

void FooSpace::FooDerived::SetSomething(int f)
{
    // Set some private variable equal to f
}

fomain. cpp-

#include "FooDerived.h"

using namespace FooSpace;

int main()
{

    FooDerived derivedObject;

    return 0;
}

控制台应用2:

页游

#include <FooDerived.h>
#include <vector>

using namespace std;
using namespace FooSpace;

class FooImpliment
{
    private:

        vector<FooDerived> fooVector;

    public:
        FooImpliment(void);
        ~FooImpliment(void);

        void SetFooVector(vector<FooDerived> newVector);

};

FOODEP. cpp

#include "FooImpliment.h"


FooImpliment::FooImpliment(void)
{
}


FooImpliment::~FooImpliment(void)
{
}

void FooImpliment::SetFooVector(vector<FooDerived> newVector)
{
    fooVector =  newVector;
}

实现主. cpp-

int main()
{
    return 0;
}

共1个答案

匿名用户

但是ConsolApp2不编译并抛出三个链接错误。

错误,ConsolApp2. cpp确实编译。问题不是编译,而是链接

在您的项目中,您应该编译

  • 食物衍生. cpp
  • FOODEC. cpp
  • 实现Main. cpp

如果不是,则将缺少的模块添加到您的项目中。

在这种情况下,似乎是Food Derive. cpp没有被编译或不是Visual Studio项目的一部分。