3

我有一个用 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 行) 对 [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

另一个奇怪的事情是它只对派生类中的 1 个产生此错误,并且派生类中的 1 个在上述构造中用于分配 shared_ptr

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

编辑解决方案:

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

设置:

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

问题:

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

解决方案:

更改链接库的顺序。

奇怪的行为:

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

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

4

1 回答 1

0

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

于 2012-09-13T14:39:40.833 回答