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
どういうわけか無限ループに入ります。
ヘッダーファイルHash.h
は、「class hash
の外観」を宣言しますが、その実装は宣言しません。これは、(おそらく)Hash.cpp
と呼ばれる他のソースファイルにあります。メインファイルにヘッダーを含めることにより、ファイルのコンパイル時にclass Hash
の説明がコンパイラーに通知されますが、class Hash
の実際の動作方法は通知されません。リンカがプログラム全体を作成しようとすると、実装(toHash::insert(int, char)
)が見つからないと文句を言います。
解決策は、実際のプログラムバイナリを作成するときにすべてのファイルをリンクすることです。 g ++フロントエンドを使用する場合、コマンドラインですべてのソースファイルを一緒に指定することでこれを行うことができます。例えば:
g++ -o main Hash.cpp main.cpp
「main」というメインプログラムが作成されます。
このエラーはすべてを伝えます:
hash :: insert(int、char)への未定義の参照
Hash.h
で定義されている関数の実装とリンクしていません。コンパイルとリンクもできるHash.cpp
がありませんか?
エラーは、insert
関数の定義を使用してファイルをコンパイルしていないことを示しています。コマンドを更新して、その関数の定義を含むファイルを含めると、機能するはずです。