質問

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

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ファイルが存在することを確認しました。

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

役に立ちましたか?

解決

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

あるいは、distributions.cppをKDevelopプロジェクトに追加することはできますか?こうすると、自動的にコンパイルおよびリンクされます(これがVisual StudioやEclipseなどでの動作です)。

他のヒント

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

ただし、実行した内容の説明から、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でこれを行う方法はわかりません。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top