使用外部变量时的多重定义错误
Multiple definition error when using extern variables
我遇到了一个奇怪的多重定义错误,我希望有人能提供帮助。
我有一个类似于以下内容的文件结构:
-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 台计算机上构建得很好,仅在我的家庭桌面上给出此错误。
清理输出目录并重新构建。也许一些旧的对象文件躺在周围。
有时,如果未编译受更改影响的文件,或者您的构建系统无法对所有依赖文件执行此操作,则可能会发生某些对象文件仍然具有引用并且链接失败的情况。
如果使用预编译标头,则在某些编译中经常发生这种情况。
相关文章:
- 使用命名空间时出现多个定义错误
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 尝试调用 .h 文件中定义的变量时出现变量未定义错误
- 在头文件和 cpp 文件中使用一次 #pragma 时出现结构重定义错误
- 链接阶段出现多重定义错误
- 避免模板类中的重定义错误
- 即使我没有包含多个文件,C++中的多个定义错误
- 跨多个类的全局变量而不会出现重定义错误?
- 尝试运行 wasm 函数时出现模块未定义错误
- C++ 预期的左大括号以及重定义错误
- C++:成员的越界声明必须是纯虚函数的定义错误
- c++中数组的未定义错误
- Visual C:模板类中的自定义错误消息
- 为什么C++模板不会导致多个定义错误?
- 只有一个定义/声明时标头声明变量的多堆定义错误
- C++ 在多个其他类中使用单个类 - 编译时出现多个定义错误
- 基类未定义.错误 C2504
- Q 斯坦达项重定义错误
- 可视化C++中的结构定义错误
- VC++ C2011 重定义错误 - 未使用的头文件