2

アップデート2:これを引き起こした前方宣言のバグを発見

更新c ++ 0xを有効にして、VisualStudio2010ストックコンパイラを使用してコンパイルしました。

奇妙な動作をしているメンバー関数を持つクラスがあります。

cppファイルでメソッドを定義すると、リンカーは「未解決の外部シンボル」エラーでフォールオーバーします。定義をヘッダーに移動すると、正常にコンパイルされます。

1)これはテンプレート化された方法ではありません2)cppファイルは間違いなくコンパイルされています3)私は困惑しています

何かご意見は?

ヘッダーファイル

// THIS IS THE ERROR HERE: I forward declare TPA as a class, when it is actually a struct
class TollingPathAttributes; // forward declare the TollingPathAttributes struct as a class (doh!)

class TollingPathAttributesOutput
{
public:
    TollingPathAttributesOutput(HighwayCommand* command);
    ~TollingPathAttributesOutput();

    void foo();
    void AddPathAttributes(boost::shared_ptr<TollingPathAttributes> attributes);

protected:
    string                                      m_outputFilename;
    vector<shared_ptr<TollingPathAttributes>>   m_data;
    queuing_mutex                               m_dataMutex;
};

cppファイル

void TollingPathAttributesOutput::foo() {}

void TollingPathAttributesOutput::AddPathAttributes(boost::shared_ptr<TollingPathAttributes> attributes)
{
    queuing_mutex::scoped_lock lock(m_dataMutex);
    m_data.push_back(attributes);
}

電話をかける

m_output->foo();  // compiles and links no problem
boost::shared_ptr<TollingPathAttributes> attr = 
    boost::make_shared<TollingPathAttributes>(origin, dest, UNTOLLED_OPTION, vector<int>(), 0.0, 0.0);
m_output->AddPathAttributes(attr); // compiles fine, but only links correctly if I move the definition to the header

リンクエラー

1>OtCustomZenith_logic.lib(TollingPathAttributesRecorder.obj) : error LNK2019: unresolved external symbol "public: void __thiscall TollingPathAttributesOutput::AddPathAttributes(class boost::shared_ptr<class TollingPathAttributes>)" (?AddPathAttributes@TollingPathAttributesOutput@@QAEXV?$shared_ptr@VTollingPathAttributes@@@boost@@@Z) referenced in function "public: virtual void __thiscall TollingPathAttributesRecorder::Record(class TolledPath &,class boost::shared_ptr<class Path>,int)" (?Record@TollingPathAttributesRecorder@@UAEXAAVTolledPath@@V?$shared_ptr@VPath@@@boost@@H@Z)     
1>..\..\..\OT\OtCustomZenith_test.exe : fatal error LNK1120: 1 unresolved externals
4

2 に答える 2

3

助けようとしたすべての人に感謝します-残念ながら、このエラーはキーボードの約1フィート後ろにありました。ここでの問題は、コンパイル時間を短縮するために前方宣言を使用することにありました。TollingPathAttributesの型を構造体ではなくクラスとして誤って前方宣言したためです。

これは、実際にTollingPathAttributesの完全な定義をcppファイルに含めたため、ヘッダーの定義がcppの定義とわずかに異なることを意味しました。この問題を混乱させた大きなことは、私が受け取ったエラーメッセージが私が受け取ることを期待していたものではなかったことです-@MarkRansomが言うように、通常、cppとヘッダーの間に不一致がある場合、それはリンクエラーではなくコンパイルエラーになります私はそれを結論付けなければなりません:

1)コンパイラーは、完全な定義を使用できるようになるとよくわかっていても、(「struct」ではなく)誤った「class」ベースの定義を単純に進めました。リンカが探しているものとはほとんど異なりますが、完全ではない署名を持つlibファイルにつながります。

2)その他の奇妙さ

于 2012-04-15T22:37:07.623 に答える
0

エラーメッセージから判断すると、.cppファイルは.libにコンパイルされています。.libのコピーが2つある可能性はありますか?1つはコンパイルごとに更新され、もう1つは.exeにリンクされていますか?

于 2012-04-12T21:29:47.790 に答える