尽管存在.o文件,但文件无法链接c ++

时间:2016-09-21 02:33:12

标签: c++ makefile linker

所以我有一个make文件,可以为哈希映射编译3个不同的文件。一个文件是哈希映射中的一个条目,一个文件是哈希映射本身,一个文件是我的主文件。我可以单独编译每个文件,但是当我尝试编译并链接主文件时,它表示我对Hashtable类的引用是未定义的,即使我在主文件中包含该类的标题。

这是我的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

我试着环顾其他地方,但没有看到我没有涉及的情况。代码中还有什么可能是错的?我也试过使用.o来获取project1命令中的文件。

这是主类代码。在我引用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;
}

1 个答案:

答案 0 :(得分:0)

当我从&#34; HashTable.h&#34;更改了包含时,问题得到解决。到&#34; HashTable.cpp&#34;

由于某种原因,我认为.h足以让链接器知道在另一个文件中找到方法的实现,但我想它不是(现在我想到了它,它有意义的是,它没有。