C++,对函数的未定义引用,尽管包含其标头 [重复]

C++, undefined reference to a function that despite including it's header [duplicate]

提问人:Liam Tyler 提问时间:9/29/2015 更新时间:9/29/2015 访问量:1550

问:

我是 C++ 的新手,正在阅读一本名为“加速 C++”的书。在其中一章中,你应该做一个程序,给定一个文本字符串,告诉你每个单词出现在哪一行。为了分解字符串中的所有单词,我使用了来自不同源文件的名为“split”的函数,但包含了它的头文件,以便我可以使用它。不过它没有用。在我的一生中,我无法弄清楚为什么链接器告诉我“对'split(std::string const&)'的未定义引用”

拆分.cpp:

#include <string>
#include <cctype>
#include <vector>
#include "split.h"

using namespace std;

bool space(char c) {
    return isspace(c);
}

bool not_space(char c) {
    return !isspace(c);
}

vector<string> split(const string& s) {
    vector<string> ret;
    string::const_iterator i = s.begin();

    while (i != s.end()) {

        i = find_if(it, s.end(), not_space);

        string::const_iterator j = i;
        j = find_if(j, s.end(), space);
        if (i != s.end())
            ret.push_back(string(i, j));

        i = j;
    }
    return ret;
}

split.h:

#ifndef GUARD_split_h
#define GUARD_split_h

#include <string>
#include <vector>

bool space(char);
bool not_space(char);
std::vector<std::string> split(const std::string&);

#endif

Word_Counter.cpp:

#include <iostream>
#include <vector>
#include <string>
#include <map>
#include "split.h"

using namespace std;

map<string, vector<int> > xref(istream& in, vector<string>
        find_words(const string&) = split) {

    string line;
    int line_number = 0;
    map<string, vector<int> > ret;

    while (getline(in, line)) {
        ++line_number;

        vector<string> words = find_words(line);

        for (vector<string>::const_iterator it = words.begin();
                it != words.end(); it++)
            ret[*it].push_back(line_number);
    }
    return ret;
}

int main() {

map<string, vector<int> > ret = xref(cin);

for(map<string, vector<int> >::const_iterator it = ret.begin();
    it != ret.end(); it++) {

    cout << it->first << "occurs on line(s): ";

    vector<int>::const_iterator line_it = it->second.begin();
    cout << *line_it;

    line_it++;

    while(line_it != it->second.end()) {
        cout << ", " << *line_it;
        line_it++;
    }
    cout << endl;
}
return 0;

}

我最近在头球方面遇到了困难。任何帮助都非常感谢!

C++ 头文件 undefined-reference default-arguments

评论

0赞 Petr 9/29/2015
你如何构建你的程序?你能编辑到问题的确切的构建行吗?您是否同时包含两个(或)文件?.o.cpp
0赞 Liam Tyler 9/29/2015
我输入的只是:“g++ Word_Counter.cpp -o Word_Counter。所有三个文件都位于同一目录中。
0赞 Liam Tyler 9/29/2015
哦,这到底是怎么回事。我只是输入了“g++ Word_Counter.cpp split.cpp”,(在我修复了一个错别字之后)它起作用了。为什么?

答:

1赞 Petr 9/29/2015 #1

如果将源拆分为多个文件,则需要让编译器了解所有文件。最简单的方法是在命令行上列出所有文件(而不是文件!.cpp.h

g++ Word_Counter.cpp split.cpp -o Word_Counter

评论

0赞 Liam Tyler 9/29/2015
因此,即使Word_Counter.cpp包含 split.h,编译器也不会自动获取 split.cpp?我的头文件真的有什么问题吗?
0赞 Petr 9/29/2015
@LiamTyler,我认为你的标题没有问题。但是,仅仅“ing”标头并不能使编译器知道相应的源。它的工作原理更简单:简单地将文本插入到 的位置,仅此而已。#include#include#include
0赞 Liam Tyler 9/29/2015
哦,我从来不知道它只是在 #include 所在的位置插入文本。非常感谢
0赞 Martin Braun 8/13/2023
如果您必须处理处理 CMakeLists.txt 的大型项目,则这些文件列在 .add_library