C++でコードを書いていて、duplicate symbolというエラーが出てコンパイルが通らないことがあった。
たとえばこんな感じ。
g++ -O2 -o ./a.out main.cc function.o
ld: duplicate symbol Find_solution(double (*)(Param&, double), Param&, double*)in function.o and /var/folders/5x/5xQHgcY6GxS5B1fAK7NoK++++TI/-Tmp-//ccr88Eat.o
collect2: ld returned 1 exit status
make: *** [constraints] Error 1
調べてみると、同じファイルを二重に include してしまったために、
関数や変数が二重定義されることで起こるエラーのようだ。
解決策としてはヘッダファイルに
#ifndef __FUNCTION_H_INCLUDED_
#define __FUNCTION_H_INCLUDED_
・・・
#endif
と入れることで、二重インクルードを防ぐ方法が一般的。
・・・のはずなのだが、ヘッダファイルに修正を加えてもエラーがとれない。
で、よくよく見てみると
一部のコードでは “function.cc”をインクルードして
別のコードでは “function.h” をインクルードするという
奇妙な状態になっていたことが分かった。
他の人から引き継いだコードだったのでチェックしていなかったのを反省。
“function.h”をインクルードするように修正することで無事に解決をみた。
ピンバック: [Error] ld: duplicate symbol | わだちの開発日記