对[class]的未定义引用/对[class]的typeinfo的未定义引用

时间:2012-09-13 13:47:33

标签: c++ c++11

我有一个用3个纯虚函数定义的基类:

class Baseclass
{
public:
    virtual ~Baseclass() {};
    virtual void getSomething(std::vector<uint8_t>& something) const = 0;
    virtual uint8_t classLength() const = 0;
}

由此我得出了另外两个类

class DerivedA : public Baseclass
{
public:
    DerivedA();
    ~DerivedA();
    bool setParamA(const std::vector<uint8_t> value);
    bool setParamB(const std::vector<uint8_t> value);
    void getSomething(std::vector<uint8_t>& something) const;
    uint8_t classLength() const;
private:
    uint8_t mParamA;
    uint8_t mParamB;
}

第二类与第一类相似。

这适用于我的单元测试(常规分配,无指针)。

现在我尝试在我的其余代码中集成它(它被编译为库),如下所示:

std::shared_ptr<Baseclass> object;
object = std::make_shared<DerivedA>(); // 1
std::dynamic_pointer_cast<DerivedA>(object)->setParamA(...) // 2

编译完美但链接会产生以下错误:

对[class](第1行)的typeinfo的未定义引用
对[class :: function](第2行)的未定义引用

关于此命令

g++-4.7  -o ../Deliv/GnuDebug/ClassesTest ../Deliv/GnuDebug/buildsupport/cppunit/mainCB.o   -pthread  ../../../../../../3rdparty/libcppunit/obj/native-gcc/libcppunit/src/cppunit/.libs/libcppunit.a ../../../Classes/Deliv/GnuDebug/libClasses.a

另一个奇怪的事情是,它只为其中一个派生类产生了这个错误,并且其中一个派生类在上面的构造中用于分配shared_ptr

我不知道这里可能出现什么问题,如果有人能指出我正确的方向我会永远感激

使用解决方案进行修改:

我找到了问题的解决方案,以便进一步参考:

设定:

Baseobject, DerivedA, DerivedB -> libObjects.a
Functionality using DerivedA, DerivedB -> libFunctionality.a
TestFunctionality using Functionality -> Error

问题:

链接器在知道libObjects之前尝试链接到libFunctionality并因此给出错误。

解决方案:

更改库链接的顺序。

奇怪的行为:

我只有DerivedA的错误,而不是DerivedB。如果我使用DerivedA注释掉代码,TestFunctionality会编译并运行而不会出错 有没有人知道为什么会这样?

有人可以验证我的解释是否正确,或许可以指点我解释这个问题的一些文章?

1 个答案:

答案 0 :(得分:0)

您必须实现函数bool DerivedA::setParamA(const std::vector<uint8_t> value);,而不仅仅是声明它。