エラーに遭遇
いつものように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
化するとエラーは無くなりました。
エラー文は最後だけ見てちゃダメですね。
というか英語が脊髄でわかるようになりたい。そうすれば脊髄反射で気づけたのに。
...視覚情報は脊髄通らないか。はは...
以上です。