<分区>
我有一个用 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] 的 undefined reference (第 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 将编译和运行而不会出错。
有没有人知道这是为什么?
有人可以验证我的解释是否正确,也许可以指出一些解释这个问题的文章吗?