質問: macのターミナルで`gcc hash.o openaddr.o main.o -o ssort`と行ったところ、 ``` duplicate symbol _hash in: hash.o openaddr.o duplicate symbol _enter in: openaddr.o main.o duplicate symbol _hash in: hash.o main.o duplicate symbol _search in: openaddr.o main.o duplicate symbol _initialize in: openaddr.o main.o duplicate symbol _show_table in: openaddr.o main.o ld: 6 duplicate symbols for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation) ``` というエラーが表示されました。 現在Visual studio codeでプログラムを書き、ターミナルで動かしています。 どのような対処をすればいいのかを教えていただけると嬉しいです。
回答: エラーメッセージを文字通り訳してみてください。 > > duplicate symbol _hash in ... > > > `_hash` という名前が ... で重複しています。 [c](/questions/tagged/c "'c' のタグが付いた質問を表示") でこのエラーが出るのは「正しくソース+ヘッダのファイル分割ができていない」からです(他の言語ではまた違う原因があるかもしれません)。どう対処すればよいか、は「分割コンパイルの際に求められる流儀に正しく従う」です。 具体的にどうすればよいかは、前にも書きましたが「正しく理解して頂くには結構な分量の解説が必要」です。この件 [c](/questions/tagged/c "'c' のタグが付いた質問を表示") 言語の初期の頃から40年近く経っていますが皆同じようにハマっています。ハマった人が色々解説記事を書いていますので、まずは検索していろいろ読んでください。 `#include "hash.c"` と書くのが誤りで、こう書くと `duplicate symbol` エラーが出る、という解説記事は探せばすぐ見つかるでしょう。 オイラがここ stackoverflow で解説記事書いてもいいんですけど、まずはご自分で検索+思考してみてください。それでもわからない点があればピンポイントで質問してください。(オイラに限らず)詳しい人が喜んで解説してくれるでしょう。