バイオインフォをやっている大学院生です。プログラミングのことなどを書きます。

VSCodeでC++のコードのコンパイルがうまくいかない

C++のコードをコンパイルするタスクが突然動かなくなってしまい、調べても解決方法がでてこなかったので備忘録です。

状況

昨日まで使っていた下のようなタスクが動かなくなりました。Macを使用してます。

"tasks": [
        {
            "label": "gnu_build",
            "type": "shell",
            "command": "/usr/local/bin/g++-9",
            "args": [
                "-std=gnu++1y",
                "-Wall",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}.exe",
                "${file}"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "problemMatcher": [
                "$gcc"
            ]
        }
    ]

/usr/local/bin/g++-9 -std=gnu++1y -Wall -o "作成される実行ファイルのフルパス" "コンパイルしたいファイルのフルパス"をシェルで実行するタスク。
テスト用のスクリプトtest.cppはこの通り。

#include <iostream>

int main()
{
    std::cout << "Hello" << std::endl;
    return 0;
}

タスクをVSCode上で実行すると、エラーメッセージ

collect2: fatal error: cannot find 'ld'
compilation terminated.
The terminal process terminated with exit code: 1

/usr/local/bin/g++-9 -std=gnu++1y -Wall -o "作成される実行ファイルのフルパス" "コンパイルしたいファイルのフルパス"をターミナルを開いて実行するとコンパイルできた。 ターミナルで次のように実行。

$ which ld
/usr/bin/ld

VSCodeでのパスが問題っぽい。

Code->Preferences->Settingsをひらく。Userのタブからsetting.jsonを適当なところから開く(デフォルトのままなら多分~/Library/Application Support/Code/User/settings.jsonになるはず)。

"terminal.integrated.inheritEnv": false

となっていた。デフォルトはtrueなので、設定をうっかり変えてしまっていたらしい。ここをtrueにしたらコンパイルできるようになった。
ちなみにこの設定項目についての説明は
Whether new shells should inherit their environment from VS Code. This is not supported on Windows
となっている。これだけだとよくわからないが、下のリンクで説明してくれている。
日本語メモ:June 2019 (version 1.36) / Visual Studio Code Updates - やまだのブログ