一番下に結論を追加しておきました。手っ取り早く解決策を見たい方は先に見るのをお勧めします。
エラーに遭遇
いつものようにVScodeでc++を使って音諳を作っていた時のこと。
デバッグしようと思ってファイルのデバッグを行おうとするとこんなエラーが出てきました。
略...
clang: error: linker command failed with exit code 1 (use -v to see invocation)
ビルドが完了しましたが、エラーが発生しました。
* ターミナル プロセスが終了コード -1 で終了しました。
* ターミナルはタスクで再利用されます、閉じるには任意のキーを押してください。
見たことないエラーだったので、いつもの如くGoogleにエラーコードを突っ込むと、何やらcode runnerのエラーだったり、task.jsonの設定ミスだったりの記事が出てきました。
しかし私、code runnerは使ってないし、ちょっと前まで動いていたし、task.jsonも問題なさそうでよくわかりませんでした。
エラーコードにlinker
って書いてあるし、エラーコードの前の方にオブジェクトファイルがたくさん出てきていたので、リンカーのエラーかなというのはわかったのですが、そこまでしかわかりませんでした。
原因
エラーが出て数十分が経過した頃。
もうほんとにわからなかったので、ちょっとずつ翻訳しようとエラーの最初の文をgoogle翻訳に突っ込みました。
すると、こんな感じでした。
duplicate symbol '__ZN15nesora_literalsli5_NSLCEPKc' in:
重複したシンボル '__ZN15nesora_literalsli5_NSLCEPKc' が次の場所に存在します:
ここで私は全てを察しました。
私はこのエラーが出る前、自前のユーザー定義リテラルを作っていたのでした。
そのリテラルの実装をヘッダーファイルに直書きしていたので、コンパイルするときにそのヘッダーファイルを include している.cpp毎に定義されて、リンカーがガッチャンコするときにその関数が重複してエラーを吐いていたのでした。
解決
ヘッダーファイルに直書きしている関数をinline
化するとエラーは無くなりました。
エラー文は最後だけ見てちゃダメですね。
というか英語が脊髄でわかるようになりたい。そうすれば脊髄反射で気づけたのに。
...視覚情報は脊髄通らないか。はは...
以上です。
追記(12/25)
再びこのエラーに見舞われたので、その原因と解決策を書きます。
原因
最近vscodeでプログラミングをする時にcmakeを使うようになったのですが、新しいファイルを作成した後にデバッグしようとすると、このエラーに見舞われました。
原因としては、cmakeで正規表現を使って"src/*.cpp"
としていたばかりに、新しく作成したファイルが認識されていないことでした。(表現これであってる?)
解決
CMakeLists.txt
を開いた状態で⌘S
をすることで解決しました。(cmakeコマンドを実行させた?)
すまん、cmake始めたてでいまいち理解してなくて表現が合ってるかわからん。すまん(-人-)
結論
何となく調べてて気づいたことを。
clang: error: linker command failed with exit code 1 (use -v to see invocation)
はリンカーのエラーで、関数の定義が無かったり重複していたり、引数が間違っていたり、template<>でミスっていたり、.cpp
ファイルがうまく認識できていなかったり、開くファイルを間違えていたり、その他関数の宣言と定義がうまくつながっていない時に出るエラーってことですね。で、その原因があまりに多いが故にインターネットの情報も錯乱している。概ねそういうことですかね。
その直接的な原因はエラーの前の部分で教えてくれていると。
つまり、エラーコードはすみずみまで読みましょうということでした!
ググる時もエラーの前半部分で調べるといいかもよ!
以上!