2017-11-16 23 views
1

私は奇妙な多重定義エラーがあり、誰かが助けてくれることを望んでいます。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台の他のコンピュータでうまく構築するとして、私は、これは本当に奇妙見つけます。

+1

何も起こらないはずのものですが、そうです。あなたが推測することができない理由を伝えることができるほどの情報がないので、[mcve]してください。 – user4581301

+0

出力ディレクトリをクリーンアップします。おそらく古いobtectファイルがいくつかあるかもしれません –

+0

質問には正確には関係ありませんが、ヘッダーに[include guards](https://en.wikipedia.org/wiki/Include_guard)や '#pragma once 'を置くことを検討してください。 –

答えて

0

出力ディレクトリをクリーンアップし、再度ビルドします。おそらく古いオブジェクトファイルがいくつかあるかもしれません。

変更によって影響を受けたファイルがコンパイルされていない場合、またはすべての依存ファイルに対してビルドシステムがそれを実行できない場合、一部のオブジェクトファイルにまだ参照があり、リンクが失敗することがあります。

これは、コンパイル済みのヘッダーを使用すると、一部のコンパイルでよく発生します。

関連する問題