链接器在标头中为 std::map 失败

Linker fails for std::map in header

本文关键字:std map 失败 链接      更新时间:2023-10-16

我正在尝试使用code::blocks和mingw创建一个简单的c ++程序,并且遇到了某种链接错误。 当我尝试构建项目时,ld 返回 1,没有其他详细信息。 我尝试在网上搜索有关此类问题的信息,但找不到任何内容。

我尝试将example的定义从test.hpp移动到test.cpp,这确实解决了链接问题,但它使我无法访问example从其他导入test.hpp的文件。 我也尝试完全删除命名空间,但出于组织原因,我想避免这种情况(如果这是命名空间的完全不恰当的使用,我将不胜感激(。 我正在尝试使我的程序的几个部分最终能够在运行时访问和更新example

测试.hpp

#include <map>
#include <string>
namespace testing{
    std::map<std::string,int> example;
}

测试.cpp

#include "test.hpp"
#include <iostream>
namespace testing {
    std::map<std::string,int> example;
}

构建输出

=== Build: Debug in SilhouetteEngine (compiler: GNU GCC Compiler) ===
error: ld returned 1 exit status
=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===

某处应该有一个更全面的构建日志,其中会说testing::example被多次定义。

解决方案很简单:仅使用 extern 关键字在头文件中声明变量:

// In header file
namespace testing{
    extern std::map<std::string,int> example;
}

你的头和 cpp 都定义了你的变量example。您应该将标头中的变量声明为 extern

如何使用 extern 在源文件之间共享变量?