未定义的文件引用

时间:2013-09-09 22:50:21

标签: c++

我正在尝试将单独的文件链接/引用以进行编译。我以前从未这样做过,所以我迷失了这个错误。 似乎就像我引用了我需要的东西。

我有三个文件,main.cpp,parser.cpp和header.h 主调用解析器来解析文本(虽然我还没能测试它是否真的有效:l)

main.cpp -

#include "header.h"

using namespace std; // I know this isn't recommended, I'm changing this later.

        int main(){
    string input, arg1, arg2;
    vector<string> parsedIn;
    cout << "<";
    while(getline(cin, input)){


            parsedIn = parser(input);
            //more code, this is the only call to parser and compile error 
            //stops here

parser.cpp -

#include "header.h"

std::vector<std::string> parser(std::string &input){
int i=0;
//int begin=1;
int  count=0;
std::vector<std::string> parsedIn;

        while(i<input.length()){

                char temp = input.at(i);
                if(temp != ' '){
                parsedIn[count] += temp;
                count++;
                }
        i++;
        }

        if(count < 3)
        parsedIn[0] = "Error"; // Set first value to "Error" to report an input issue

return parsedIn;
}

header.h

#include <algorithm>
#include <iostream>
#include <vector>
#include <string>
#include <fstream>

std::vector<std::string> parser(std::string &input);

我知道我也应该使用警卫,但我的TA并没有明确说明我如何设置这些......尽管如此。这是我第一次使用C ++,所以我想弄清楚为什么没有引用它。

当然,错误是对解析器的未定义引用。

编辑:我对代码进行了更改,以反映我在您的建议中所做的工作。

特别是解析(std :: string&amp; input)已成为解析器(std :: string&amp; input)

3 个答案:

答案 0 :(得分:7)

parser.cpp的“解析器”方法拼写为“parse”,但是你的header.h说它的名字叫“解析器”。

答案 1 :(得分:3)

你还有另一个问题。

std::vector<std::string> parsedIn;
// ...
parsedIn[count] += temp;

向量parsedIn的大小为0.在空向量上使用[]会导致未定义的行为。您需要执行push_back操作才能向向量添加元素。与std::map容器不同,您不能使用[]运算符向向量添加元素。

答案 2 :(得分:0)

您无法链接您的文件。

小步骤:

1)如果您还没有,请写helloWorld。源文件可以称为hello.cpp

2)而不是从源到可执行文件的一步构建,如下所示:

g++ hello.cpp

尝试构建目标文件hello.o,然后构建可执行文件:

g++ -c hello.cpp -o hello.o
g++ hello.o -o hello

3)添加一些小函数,称之为void foo(),不带任何参数,不返回任何内容,打印出一些内容而不做任何其他操作。将其放入hello.cpp不要继续,直到它完美无缺。

4)将foo()移动到其自己的源文件(foo.cpp)和头文件(foo.h)。现在不要担心头卫。像这样编译和构建:

g++ -c hello.cpp -o hello.o
g++ -c foo.cpp -o foo.o
g++ hello.o foo.o -o hello

如果你走得这么远,你做得很好。