使用命名空间 C++ 的未定义引用

时间:2021-01-20 16:25:25

标签: c++ namespaces undefined-reference

当我想运行代码时,编译器会说 undefined reference to math::calc

我在 StackOverflow 上阅读了有关此问题的问答,但它并没有帮助我解决问题。

Comp.h

#include <utility>
namespace math {
    typedef std::pair<double,double> Comp;
    double getFirst(Comp a);
    ...
}

Comp.cpp

#include "comp.h"
namespace math {
    double getFirst(Comp a) {
        return a.first;
    }
    ...
}

Comp 文件:每个函数都返回 Compdouble。我多次调用 cal.cpp 文件中的函数

cal.h

#include "comp.h"
#include "helper.h"
namespace math {
    Comp calc(const string& str);
    ...
}

cal.cpp

#include "eval.h"
namespace math {
    Comp calc(const string& str) {
        ...
    }
}

Cal 文件:某些函数返回 comp 类型,而不仅仅是 cal 函数。

helper.h

namespace math {
    ...
}

helper.cpp

#include "helper.h"
namespace math {
    ...
}

helper 文件只包含我从 cal.cpp 文件调用的几个函数。每个函数都会调用多次。

main.cpp

#include "calc.h"
int main() {
    string str = "  ";
    pair<double,double> res = math::calc(str);
    cout << res.first << " " << res.second << endl;
    return 0;
}

在整个项目中,我没有使用任何类。

我包含了我调用的所有文件,除了 c++ 原始文件。

我在每个文件中都使用了 std 命名空间,但我没有在这里写。

我完全不知道我的代码有什么问题。

如果我还在 cal.cpp 中包含 main.cpp,代码编辑器会对我从 undefined reference 调用的每个文件说 helper.h。我不想在刚刚提到的 cal.cpp 文件中包含 main

1 个答案:

答案 0 :(得分:1)

您必须编译所有项目的 *.cpp 文件,然后正确链接它们(编译结果) - 链接过程取决于您使用的环境/IDE,只需查找即可。如果您没有正确链接它,最终的可执行文件将不会具有所需的所有函数定义,因此会获得未定义的引用