私は奇妙な多重定義エラーがあり、誰かが助けてくれることを望んでいます。extern変数を使用するときの多重定義エラー
私は、次のようなファイル構造を持っている:
-Folder
---data.cpp
---interface.cpp
---initialize.cpp
---internal.hpp
---maincode.cpp
internal.hppは、このフォルダ内のすべてのソースコードファイルに含まれています。それはそうと同じように、data.cppで定義された変数のための前方宣言として使用されるように3つのextern変数を持っています
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
これは、コンパイラが宣言ではなく定義としてこれらのextern変数を扱っているかのように、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台の他のコンピュータでうまく構築するとして、私は、これは本当に奇妙見つけます。
何も起こらないはずのものですが、そうです。あなたが推測することができない理由を伝えることができるほどの情報がないので、[mcve]してください。 – user4581301
出力ディレクトリをクリーンアップします。おそらく古いobtectファイルがいくつかあるかもしれません –
質問には正確には関係ありませんが、ヘッダーに[include guards](https://en.wikipedia.org/wiki/Include_guard)や '#pragma once 'を置くことを検討してください。 –