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 はエラーなしでコンパイルおよび実行されます。
これがなぜなのか、誰にも手がかりがありますか?
そして、誰かが私の説明の正しさを検証し、おそらくこの問題を説明する記事を教えてもらえますか?