我有一个奇怪的多重定义错误,我希望有人可以提供帮助。
我的文件结构类似于以下内容:
-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台计算机上构建得很好,只在我家的桌面上出现此错误。
答案 0 :(得分:0)
清理输出目录并重新构建。也许有些旧的目标文件在四处闲置。
有时,如果没有编译受更改影响的文件,或者您的构建系统无法对所有相关文件执行此操作,则可能会发生一些目标文件仍然存在引用且链接失败。
如果您使用预编译的标头,则会在某些编译时发生这种情况。