したがって、ハッシュマップ用に3つの異なるファイルをコンパイルするmakeファイルがあります。 1つのファイルはハッシュマップのエントリであり、1つのファイルはハッシュマップそのものであり、1つのファイルはメインファイルです。私は個々のファイルを個別にコンパイルすることができますが、メインファイルをコンパイルしてリンクしようとすると、そのクラスのヘッダをメインファイルに含めても、私のHashtableクラスへの参照は定義されていません。.oファイルがあるにもかかわらず、ファイルをC++にリンクできないようにする
ここに私のメイクファイルです:
all: project1
project1:
g++ -o project1 main.cpp HashTable.cpp HashEntry.cpp -g -Wall
main.o: HashTable.o
g++ -c -Wall -g main.cpp
HashTable.o: HashEntry.o
g++ -c -Wall -g HashTable.cpp
HashEntry.o:
g++ -c -Wall -g HashEntry.cpp
clean:
rm *.o
は、私が他の場所を中心に探してみましたが、私はカバーされていない状況が表示されませんでした。コード内で何が間違っているのでしょうか? project1コマンドのファイルにも.oを使ってみました。
ここに主要なクラスコードがあります。それは私がハッシュテーブル(24、45、53、57は、未定義の参照があると言うライン)
#include <vector>
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include "HashTable.h"
int main(int argc, char *argv[]){
std::vector<std::string> keyList;
std::ifstream inputFile(argv[1]);
int numInputs = 0;
std::string line;
if(inputFile.is_open()){
while(getline(inputFile,line)){
std::stringstream currLine(line);
numInputs++;
std::string textCatch;
getline(currLine,textCatch,',');
keyList.push_back(textCatch);
}
}
inputFile.close();
HashTable *dataTable = new HashTable(numInputs);
std::ifstream secondPass(argv[1]);
if(secondPass.is_open()){
while(getline(secondPass,line)){
std::stringstream currLine(line);
std::string field;
int value1;
int value2;
getline(currLine, field, ',');
std::string key = field;
getline(currLine, field, ',');
std::istringstream convert(field);
if(!(convert >> value1)){
value1 = NULL;
}
getline(currLine, field);
std::istringstream convert2(field);
if(!(convert2 >> value2)){
value2 = NULL;
}
dataTable->put(key,value1,value2);
}
}
secondPass.close();
std::ofstream outputFile("output.dat");
for(int i = 0; i < keyList.size(); i++){
std::string key = keyList[i];
double average = dataTable->getAverage(key);
std::ostringstream stringStream;
stringStream << average;
std::string avgString = stringStream.str();
int max = dataTable->getMax(key);
stringStream << max;
std::string maxString = stringStream.str();
outputFile << key + " | " + avgString + " | " + maxString;
}
outputFile.close();
return 0;
}
あなたのメークファイルは明らかに壊れています。最初のターゲットだけが使用され、毎回3つのcppファイルをソースからコンパイルしてリンクします。これはメークファイルのためのものではありません。しかし、それは必ずしもあなたの問題とは関係がないかもしれません。この質問には、それぞれの関連ファイルの内容に関して[mcve]がなければ答えられません。質問を編集し、[mcve]を追加する必要があります。 –
Makefileを明示的に使用する理由2016年にCMake? – iksemyonov
私たちの教授が変わるのは頑固なので、私たちの割り当てにはメイクファイルを使う必要があるからです。また、メインクラス – user3311613