46

重複の可能性:
未定義の参照/未解決の外部シンボルエラーとは何ですか?それを修正するにはどうすればよいですか?

経由で私のプログラムをコンパイルしようとしていますg++ -o prog1 main.cpp -std=c++0x

エラーが発生します:

/tmp/cc1pZ8OM.o: In function `main':
main.cpp:(.text+0x148): undefined reference to `Hash::insert(int, char)'
collect2: error: ld returned 1 exit status

main.cpp

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <functional>
#include "Hash.h"

using namespace std;

int main(int argc, char *argv[]) {
//preset prime number 
int prime = 101;
hash<char> h1;
int key;
Hash HashTable;

// check for Request & string parameters
if(argc != 3) {
    cout << "Run program with 2 parameters. [Lower Case]" << endl;
    cout << "[1] insert, find, or delete" << endl;
    cout << "[2] string" << endl;
}

if(strcmp(argv[1], "insert") == 0) {
    //Get Hash for argv[2] aka value
    key = h1(*argv[2]);

    //check 1
    cout << "Hash: " << key << endl;

    key = key % prime;

    //check 2
    cout << "Mod 101 Hash: " << key << endl;

    HashTable.insert(key, *argv[2]); //PROBLEM here

}

return 0;
}

Hash.hファイル:

#include <iostream>
#include <cstring>
#include "LinkedList.h"
using namespace std;

class Hash {
//100 slot array for hash function
LinkedList *hashFN[100];

public:
void insert(int key, char value);
//void deleteItem(int key);
//char* find(int key);


};

何か案は?これを使用して、設定されたサイズのハッシュテーブルを作成します。

編集:Hash.cppファイル

#include <iostream>
#include <cstring>
#include "Hash.h"

using namespace std;

void Hash::insert(int key, char value){
*hashFN[key]->addFront(value);
cout << "Success!" << endl;

}

今ターミナル経由でコンパイルしようとしています:

g ++ -c Hash.cpp -o Hash.o

g ++ -o prog1 main.cpp Hash.o -std = c ++ 0x

どういうわけか無限ループに入ります。

4

3 に答える 3

55

ヘッダー ファイルはHash.h「どのように見えるべきか」を宣言しますclass hashが、その実装は宣言しません。これは、(おそらく) と呼ぶ他のソース ファイルにありますHash.cpp。メイン ファイルにヘッダーを含めることにより、ファイルのコンパイル時にコンパイラに説明が通知されますが、実際の動作は通知されclass Hashません。class Hashリンカーがプログラム全体を作成しようとすると、実装 ( toHash::insert(int, char)) が見つからないというエラーが表示されます。

解決策は、実際のプログラム バイナリを作成するときにすべてのファイルをリンクすることです。g++ フロントエンドを使用する場合、コマンド ラインですべてのソース ファイルを一緒に指定することでこれを行うことができます。例えば:

g++ -o main Hash.cpp main.cpp

「main」というメインプログラムを作成します。

于 2013-01-28T07:56:42.390 に答える
27

このエラーはあなたにすべてを伝えます:

Hash::insert(int, char) への未定義の参照

で定義されている関数の実装とリンクしていませんHash.hHash.cppコンパイルしてリンクする必要もありませんか?

于 2013-01-28T07:53:22.790 に答える
0

エラーは、insert関数の定義でファイルをコンパイルしていないことを示しています。コマンドを更新して、その関数の定義を含むファイルを含めると、機能するはずです。

于 2013-01-28T08:04:45.797 に答える