在 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,这将无法使用命令行进行管理。这就是人们创建 make
、cmake
和 bazel
.
等构建系统的原因
有关更详细的信息,请参阅针对您的链接器错误情况的答案 here。
我通读了所有我能找到但找不到解决方案的类似“未定义引用”线程。大多数其他线程也涉及 类,我不打算将其用于此目的。如果我在 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,这将无法使用命令行进行管理。这就是人们创建 make
、cmake
和 bazel
.
有关更详细的信息,请参阅针对您的链接器错误情况的答案 here。