在 C++ 中使用 headers 中的命名空间时未定义对链接器错误的引用

Undefined reference to linker error when using namespaces in headers in c++

我通读了所有我能找到但找不到解决方案的类似“未定义引用”线程。大多数其他线程也涉及 类,我不打算将其用于此目的。如果我在 header 中定义函数而不是使用外部 .cc 文件,程序编译会正常执行。我觉得我在这里遗漏了一些简单的东西。

这是我能组合起来重现我遇到的问题的最简单的测试。

编译器:g++ (Debian 8.3.0-6) 8.3.0

hntest.h

namespace hntest
{
    void pewpew();
}

hntest.cc

#include <iostream>
#include "hntest.h"

namespace hntest
{
    void pewpew()
    {
        std::cout << "pew pew pew!!!" << std::endl;
    }
}

hntestmain.cc

#include "hntest.h"

int main(int argc, char* argv[])
{
    hntest::pewpew();
}

我正在尝试编译:

g++ -lstdc++ hntestmain.cc -o hntestmain

我收到以下链接器错误:

hntestmain.cc:(.text+0x10): undefined reference to `hntest::pewpew()'
collect2: error: ld returned 1 exit status

我尝试通读了几个流行的 C++ 库的代码以及我自己的一些较旧的 C(不是 ++)代码和 makefile,但未能找到我的错误。诚然,我既是业余爱好者,又有点生疏。

我错过了什么?

您实际上并未编译具有 pewpew.

定义的 cpp 文件

尝试:

g++ -lstdc++ hntestmain.cc hntest.cc -o hntestmain

编译器需要知道所有的源文件。头文件在预处理期间处理,并知道在同一文件夹中查找。您可以想象,如果您有更多文件,比如 10、100 或 10000,这将无法使用命令行进行管理。这就是人们创建 makecmakebazel.

等构建系统的原因

有关更详细的信息,请参阅针对您的链接器错误情况的答案 here