2009-04-30 30 views
4

私は同様の問題を見てみましたが、私の問題を助けたものを簡単に見つけることができませんでした。リンカーエラー:未定義参照C++

私はC++でプロジェクトを作成し、コンパイル、リンク、実行するためにUNIXで作業しています。私の特定の問題は、別のファイルで宣言するメソッドへの未定義の参照です。ファイルSharedCache.cppで

、私は次の方法があります。

int SharedCache::replaceLine(ullong address){ 
    int evictPID = -1; 

    int cacheSet = calcCacheSet(address); 
    //random uniformly-distributed value for cache line 
    float numLines = static_cast<float>(CACHE_LINES_PER_SET); 
    uint cacheLine = static_cast<uint>(uniformDistr(numLines)); 

    if(cache[cacheSet][cacheLine] != NULL){ 
     evictPID = cache[cacheSet][cacheLine]->PID; 
    } 

    uint PID= calcPID(address); 
    uint tag= calcTag(address); 

    cache[cacheSet][cacheLine]->setLine(PID, tag); //mutex method 

    return PID; 
} 

ラインuint cacheLine = static_cast<uint>(uniformDistr(numLines));は、私は別のファイルから使用する関数を呼び出します。リンカーエラーは、このメソッドへの未定義の参照です。

uniformDistr(float); distributions.hヘッダーで宣言され、distributions.cppで定義されています。私のプロジェクトオプションでは、リンカーのフラグを設定しました - ディストリビューションとdistributions.cppをコンパイルして、distributions.oファイルがリンクすることを確認しました。

これは問題を解決していないため、ここからはどこに行くのかわかりません。

+0

あなたのC++はOKです。リンカのエラーはビルドの間違いを意味することがよくあります。Makefileを投稿しますか? –

+0

Makefileは非常に長く、オーバーフローテキストの書式設定には簡単ではありません。まだ役に立つと思うなら、私は先に進んで投げてください –

答えて

2

私はKDevelopを使用していませんが、コマンドラインでは、リンクプロセスの入力ファイルとしてdistributions.oを追加するだけです。ダッシュや.o拡張子を省略する必要はありません。

また、distributions.cppをKDevelopプロジェクトに追加できますか?そうすれば、自動的にコンパイルしてリンクする必要があります(これはVisual StudioやEclipseのように動作します)。

+0

* sigh *私はそれがプロジェクトにあると思ったが、そうではないと思う。それは、飛行中にKDevelopを手に入れようとして得たものです。申し訳ありません –

0

あなたのmakefileにdistributions.cppを追加しましたか?また、私は必要なリンカーフラグは-ldistributionsだと思います。

+0

-ldistributionsを試してみましたが、その場合は構成エラーが発生しました。それはそれだとは思わない。また、私はmakefileを扱うKDevelopを使っています。私はmakefileを再構築させましたが、distributions.cppを追加する正確な場所はありません。 –

3

どのコンパイラ/リンカーコマンドが呼び出されたか正確なエラー出力が得られたかについての正確な情報がないと、適切な回答を提供することが困難です。

ただし、あなたが行ったことの説明から、distributions.oをリンカーに渡していないようです。コンパイラ/リンカーが自動的にリンクするオブジェクトファイルを検索する他の言語とは異なり、C++リンカでは、リンクするオブジェクトの明示的な指定が必要です。

ここ-ldistributionsのご使用が正しくありません:あなたは別のオブジェクトファイルを指定するのに対し、-lフラグは、静的または動的ライブラリ(それぞれ.AおよびLinux上の.soファイル)へのリンクに使用されますを参照してください。 -ldistributionsを指定すると、リンカーは標準ライブラリの場所でdistributions.aまたはdistributions.soを検索します。

は基本的に、あなたのリンカの呼び出しは、今、この(おそらくより多くのフラグとライブラリとの)のようなものになります。正確に分布コードをリンクするために

gcc -o my_program SharedCache.o -ldistributions 

を、あなたはそれが再びのようなものを(見えるようにする必要があり、おそらく本物に比べて不足している多くのフラグとライブラリ):

gcc -o my_program SharedCache.o distributions.o 

これは)不足しているシンボルの問題を解決し、作業バイナリ(または非常に少なくとも別のエラーが;-)生成する必要があります。しかし、KDevelopでこれを行う方法はわかりません。