2012-04-12 6 views
2

アップデート2をするとき、外部未解決:C +には、Visual Studio 2010の在庫コンパイラを使ってコンパイル:更新こののcppファイルで定義された方法ではなく、ヘッダー内の

を起こし、前方宣言のバグを発見+ 0xが有効になりました。

私は、不思議な動作をしているメンバー関数を持つクラスを持っています。

私がcppファイルでメソッドを定義すると、リンカーは "未解決の外部シンボル"エラーになります。定義をヘッダーに移動すると、コンパイルが正常に行われます。

1)これは私が

任意の考えを困惑)CPPファイルは間違いなく) 3をコンパイルされているテンプレートの方法 2ではないでしょうか?

ヘッダファイル

// 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>)" ([email protected]@@[email protected]@@@[email protected]@@Z) referenced in function "public: virtual void __thiscall TollingPathAttributesRecorder::Record(class TolledPath &,class boost::shared_ptr<class Path>,int)" ([email protected]@@[email protected]@[email protected]@@@[email protected]@[email protected])  
1>..\..\..\OT\OtCustomZenith_test.exe : fatal error LNK1120: 1 unresolved externals 
+4

どのようにコンパイルしていますか? –

+0

私の正常なデバイスではありません。私はテストすることができないので、これは単なる誤植かもしれませんが、m_dataはshared_ptrのベクトルです(名前空間としてのboostではなく)。他の参照には名前空間があります。 – tmpearce

+0

@tmpearce明示的なboost :: shared_ptrは、メソッドのcall site/header/cpp定義間の不一致を排除することでした。私は一般的にboost :: shared_ptrをどこかで使用しています。私はshared_ptrがboost名前空間から来ていると確信しています。 –

答えて

3

お手数をおかけしてくれたおかげで、残念ながらこのエラーはキーボードの約1フィート先でした。ここでの問題は、コンパイル時間を短縮するために前方宣言を使用することになりました。ため、私は間違って前方は構造体の代わりにクラスとしてTollingPathAttributesの型を宣言しました。

これは、実際にはcppファイルにTollingPathAttributesの完全な定義が含まれているため、ヘッダーの定義がcppの定義と少し違っていることを意味していました。この問題を混乱させた大きな理由は、私が受け取ったエラーメッセージが、受け取っているとは思っていなかったということです。@ MarkRansomによれば、通常、cppとヘッダーの間に不一致があると、リンクエラーではなくコンパイルエラーになります

1)コンパイラは、いったん完全な定義が利用可能になると、それがよくわかっていても、誤った 'class'(構造体)ベースの定義を先に進めてしまっただけです。リンカが探しているものとほとんど同じではないシグネチャを持つlibファイルを作成します。

2)他の奇妙なもの

0

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

+0

四角形のアイデアマークのためにありがとう、しかし、私はこれが当てはまるとは思わない。私はメソッドfoo **を追加した後、**この問題は頭を抱えて、cppファイルの定義を提供しました(同じものは別のメソッドを定義しようとしています)。 1つのlibファイルですが、メソッド定義が含まれていないか、奇妙なシグネチャに含まれています。おそらく、そこにあるものを正確に見るためにlibを分割する必要があります。 –

+0

@JamieCook、それは価値があった - それは簡単に間違いです。私は、同じ.cpp内の2つの異なる機能がどのように異なる結果につながるか理解していません。たとえシグネチャがヘッダ内のものと一致しなくても、コンパイラはそれがリンカに到達する前にそれについて文句を言うべきです。 –

+0

これはまさに私が思っていたことです - なぜ私はこの問題についてとてもうんざりしています - それを「未解決の謎」としなければならないかもしれません:) –

関連する問題