2016-09-21 5 views
0

したがって、ハッシュマップ用に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; 
} 
+0

あなたのメークファイルは明らかに壊れています。最初のターゲットだけが使用され、毎回3つのcppファイルをソースからコンパイルしてリンクします。これはメークファイルのためのものではありません。しかし、それは必ずしもあなたの問題とは関係がないかもしれません。この質問には、それぞれの関連ファイルの内容に関して[mcve]がなければ答えられません。質問を編集し、[mcve]を追加する必要があります。 –

+0

Makefileを明示的に使用する理由2016年にCMake? – iksemyonov

+0

私たちの教授が変わるのは頑固なので、私たちの割り当てにはメイクファイルを使う必要があるからです。また、メインクラス – user3311613

答えて

0

私はハッシュテーブル「に「HashTable.h」から含めるを変更したときに問題が修正されましたを参照して、いつでも文句を言っています。 cpp "

何らかの理由で、.hはリンカが他のファイルのメソッドの実装を知るのに十分であると思っていましたが、私はそうではないと思います。それは意味がありません)。

+0

あなたのMakefileは[これと似たような](http://pastebin.com/yQMsUHDy)のように見えます。 *暗黙のルールを*使用したい場合はさらに短くなる可能性があります。 Gnu makeの優れたオンラインリファレンス[こちらをご覧ください](https://ftp.gnu.org/old-gnu/Manuals/make-3.79.1/html_chapter/make_toc.html)運が良かった。 – WhozCraig

+0

これは非常に悪い解決策です。あなたのmakefileを修正するか、リンカーを正しく使うことを習得する代わりに、オブジェクトファイルを持つメリットを捨てるようにソースファイルをkludgedしました。 – Beta

関連する問題