2016-09-21 78 views
0

所以我有一個make文件爲散列圖編譯3個不同的文件。一個文件是哈希映射中的條目,一個文件是哈希映射本身,一個文件是我的主文件。我可以單獨編譯每個文件,但是當我嘗試編譯並鏈接主文件時,它說我對Hashtable類的引用是未定義的,儘管我在主文件中包含了該類的頭文件。使文件無法鏈接C++,即使.o文件存在

這是我的make文件:

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作爲文件。

這是主要的班級代碼。這是抱怨我引用的HashTable任何時間(線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

你的makefile顯然壞了。每次只使用第一個目標,這將始終編譯和鏈接來自源的三個cpp文件。這不是makefile的用處。但是,這可能不一定與你的問題有關。這個問題在每個相關文件的內容方面都沒有[mcve]的回答。你需要編輯你的問題,並添加[mcve]。 –

+0

爲什麼明確使用Makefile而不是例如CMake在2016年? – iksemyonov

+0

由於我們的教授固執己見,所以需要使用makefile來完成我們的任務。另外,更新OP顯示我的主類 – 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或正確學習使用鏈接器,你已經以一種拋棄了擁有目標文件的優勢的方式來扼殺你的源文件。 – Beta