使用外部变量时的多重定义错误

Multiple definition error when using extern variables

本文关键字:定义 错误 外部 变量      更新时间:2023-10-16

我遇到了一个奇怪的多重定义错误,我希望有人能提供帮助。

我有一个类似于以下内容的文件结构:

-Folder
---data.cpp
---interface.cpp
---initialize.cpp
---internal.hpp
---maincode.cpp

internal.hpp 包含在此文件夹的所有源代码文件中。它有 3 个 extern 变量用作 data.cpp 中定义的变量的前向声明,如下所示:

内部.hpp:

namespace montecarlo{
   namespace internal{
      extern std::vector<std::vector<int> > c_octants; 
      extern std::vector<std::vector<int> > b_octants; 
      extern bool mc_parallel_initialized;
   } // end of internal namespace
} // end of montecarlo namespace

数据.cpp:

#include "internal.hpp"
namespace montecarlo{
   namespace internal{
      std::vector<std::vector<int> > c_octants;
      std::vector<std::vector<int> > b_octants; 
      bool mc_parallel_initialized;
   } // end of internal namespace
} // end of montecarlo namespace

出于某种原因,这在包含的每个文件之间都给出了多个定义错误 internal.hpp 包含在 和数据.cpp中,就好像编译器将这些 extern 变量视为定义而不是声明一样。

obj/montecarlo/interface.o:(.bss+0x30): multiple definition of `montecarlo::internal::c_octants'
obj/montecarlo/data.o:(.bss+0x30): first defined here
obj/montecarlo/interface.o:(.bss+0x10): multiple definition of `montecarlo::internal::b_octants'
obj/montecarlo/data.o:(.bss+0x10): first defined here
obj/montecarlo/interface.o:(.bss+0x0): multiple definition of `montecarlo::internal::mc_parallel_initialized'
obj/montecarlo/data.o:(.bss+0x0): first defined here
obj/montecarlo/mc.o:(.bss+0x30): multiple definition of `montecarlo::internal::c_octants'
obj/montecarlo/data.o:(.bss+0x30): first defined here
obj/montecarlo/mc.o:(.bss+0x10): multiple definition of `montecarlo::internal::b_octants'
obj/montecarlo/data.o:(.bss+0x10): first defined here
obj/montecarlo/mc.o:(.bss+0x0): multiple definition of `montecarlo::internal::mc_parallel_initialized'
obj/montecarlo/data.o:(.bss+0x0): first defined here
obj/montecarlo/mc_moves.o:(.bss+0x30): multiple definition of `montecarlo::internal::c_octants'
obj/montecarlo/data.o:(.bss+0x30): first defined here
obj/montecarlo/mc_moves.o:(.bss+0x10): multiple definition of `montecarlo::internal::b_octants'
obj/montecarlo/data.o:(.bss+0x10): first defined here
obj/montecarlo/mc_moves.o:(.bss+0x0): multiple definition of `montecarlo::internal::mc_parallel_initialized'
obj/montecarlo/data.o:(.bss+0x0): first defined here
obj/montecarlo/cmc.o:(.bss+0xb0): multiple definition of `montecarlo::internal::c_octants'
obj/montecarlo/data.o:(.bss+0x30): first defined here
obj/montecarlo/cmc.o:(.bss+0x90): multiple definition of `montecarlo::internal::b_octants'
obj/montecarlo/data.o:(.bss+0x10): first defined here
obj/montecarlo/cmc.o:(.bss+0x80): multiple definition of `montecarlo::internal::mc_parallel_initialized'
obj/montecarlo/data.o:(.bss+0x0): first defined here
obj/montecarlo/cmc_mc.o:(.bss+0x70): multiple definition of `montecarlo::internal::c_octants'
obj/montecarlo/data.o:(.bss+0x30): first defined here
obj/montecarlo/cmc_mc.o:(.bss+0x50): multiple definition of `montecarlo::internal::b_octants'
obj/montecarlo/data.o:(.bss+0x10): first defined here
obj/montecarlo/cmc_mc.o:(.bss+0x48): multiple definition of `montecarlo::internal::mc_parallel_initialized'
obj/montecarlo/data.o:(.bss+0x0): first defined here
obj/montecarlo/monte_carlo_preconditioning.o:(.bss+0x30): multiple definition of `montecarlo::internal::c_octants'
obj/montecarlo/data.o:(.bss+0x30): first defined here
obj/montecarlo/monte_carlo_preconditioning.o:(.bss+0x10): multiple definition of `montecarlo::internal::b_octants'
obj/montecarlo/data.o:(.bss+0x10): first defined here
obj/montecarlo/monte_carlo_preconditioning.o:(.bss+0x0): multiple definition of `montecarlo::internal::mc_parallel_initialized'
obj/montecarlo/data.o:(.bss+0x0): first defined here
collect2: error: ld returned 1 exit status
makefile:177: recipe for target 'serial' failed
make: *** [serial] Error 1

我觉得这真的很奇怪,因为这似乎符合 extern 的正确用法,并且此代码在其他 2 台计算机上构建得很好,仅在我的家庭桌面上给出此错误。

清理输出目录并重新构建。也许一些旧的对象文件躺在周围。

有时,如果未编译受更改影响的文件,或者您的构建系统无法对所有依赖文件执行此操作,则可能会发生某些对象文件仍然具有引用并且链接失败的情况。

如果使用预编译标头,则在某些编译中经常发生这种情况。