4

同様の問題を調べてみましたが、問題を解決する問題を簡単に見つけることができませんでした。

私は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を設定し、distributions.cppをコンパイルして、リンク先のdistributions.oファイルが存在することを確認しました。

ここからは、問題が解決していないので、どこに行けばいいのかわかりません。

4

3 に答える 3

3

どのコンパイラ/リンカコマンドが呼び出されたか、および正確なエラー出力に関するより正確な情報がなければ、適切な回答を提供することは困難です。

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

ここでの-ldistributionsの使用は正しくありません。-lフラグは静的または動的ライブラリ(Linuxではそれぞれ.aファイルと.soファイル)にリンクするために使用されますが、リンカーが考慮する必要のある別のオブジェクトファイルを指定する必要があります。指定-ldistributionsすると、リンカは標準ライブラリの場所を検索しdistributions.aます。distributions.so

基本的に、リンカーの呼び出しは次のようになります(おそらく、さらに多くのフラグとライブラリがあります)。

gcc -o my_program SharedCache.o -ldistributions

ディストリビューションコードを正しくリンクするには、次のように表示する必要があります(ここでも、実際のものと比較して、多くのフラグとライブラリが欠落している可能性があります)。

gcc -o my_program SharedCache.o distributions.o

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

于 2009-04-30T22:33:00.510 に答える
2

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

または、distributions.cppをKDevelopプロジェクトに追加することもできますか?そうすれば、コンパイルされて自動的にリンクされるはずです(これは、Visual StudioやEclipseなどでどのように機能するかです)。

于 2009-04-30T22:31:52.883 に答える
0

makefileにdistributions.cppを追加しましたか?また、必要なリンカーフラグは-ldistributionsです。

于 2009-04-30T22:07:33.347 に答える