使用extern变量时出现多重定义错误

时间:2017-11-16 19:48:37

标签: c++

我有一个奇怪的多重定义错误,我希望有人可以提供帮助。

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

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

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

internal.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

data.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包含在data.cpp中,就像编译器将这些外部变量视为定义而不是声明一样。

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台计算机上构建得很好,只在我家的桌面上出现此错误。

1 个答案:

答案 0 :(得分:0)

清理输出目录并重新构建。也许有些旧的目标文件在四处闲置。

有时,如果没有编译受更改影响的文件,或者您的构建系统无法对所有相关文件执行此操作,则可能会发生一些目标文件仍然存在引用且链接失败。

如果您使用预编译的标头,则会在某些编译时发生这种情况。

相关问题