3

3 つの純粋仮想関数で定義された基本クラスがあります。

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

そして、それから私は2つの他のクラスを派生させます

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;
}

2 番目のクラスは最初のクラスに類似しています。

これはコンパイルされ、単体テストで完全に機能します (通常の割り当て、ポインターなし)。

今、私はこれを次のように残りのコードに統合しようとしています(ライブラリとしてコンパイルされています):

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

コンパイルは完全に行われますが、リンクすると次のエラーが発生します。

[class] の typeinfo への未定義参照 (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つに対してのみこのエラーが生成され、派生クラスの1つがshared_ptrの割り当てのための上記の構築で機能したことです。

ここで何が間違っているのかわかりません。誰かが私を正しい方向に向けることができれば、私は永遠に感謝します

ソリューションで編集:

私は自分の問題の解決策を見つけたので、さらに参照するために:

設定:

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

問題:

リンカーがlibObjectsを認識する前にlibFunctionalityにリンクしようとしていたため、エラーが発生したこと。

解決:

ライブラリがリンクされる順序を変更します。

奇妙な振る舞い:

DerivedB ではなく、DerivedA でのみエラーが発生しました。DerivedA を使用してコードをコメント アウトすると、TestFunctionality はエラーなしでコンパイルおよび実行されます。
これがなぜなのか、誰にも手がかりがありますか?

そして、誰かが私の説明の正しさを検証し、おそらくこの問題を説明する記事を教えてもらえますか?

4

1 に答える 1

0

bool DerivedA::setParamA(const std::vector<uint8_t> value);関数を宣言するだけでなく、関数を実装する必要があります。

于 2012-09-13T14:39:40.833 に答える