MacのVSCodeでC++を書く環境構築

(2020-01-04)

Extension

を入れてHello Worldを書いたところ、stdio.hが見つからず#includeの行に赤線が付いた。

#include <stdio.h>

int main(void)
{
    printf("Hello World!\n");
    return 0;
}

Command Palletteから C/C++: Edit Configurations (JSON) を選ぶと .vscode/c_cpp_properties.json が生成されるので編集していく。

Xcode 10から/usr/includeにHeaderファイルが置かれなくなったようなのでincludePathにXcodeのSDKのパスを追加する。

$ xcode-select --install
$ xcrun --show-sdk-path
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk

$ ls -l /Library/Developer/CommandLineTools/SDKs/
total 0
drwxr-xr-x  7 root  wheel  224  7 23 08:49 MacOSX.sdk
lrwxr-xr-x  1 root  wheel   10  7 23 08:48 MacOSX10.14.sdk -> MacOSX.sdk

$ ls /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/ | grep "stdio.h"
_stdio.h
stdio.h

ついでにcompilerPathをclangにした。これはIntelliSenseをうまく働かせるための設定らしい。 clangはLLVMバックエンドのC/C++コンパイラで、Macだとgccコマンドもclangを指すようになっている。

$ gcc -v
Apple LLVM version 10.0.1 (clang-1001.0.46.4)

$ clang -v
Apple LLVM version 10.0.1 (clang-1001.0.46.4)

c_cpp_properties.json はこんな感じになった。

{
    "configurations": [
        {
            "name": "Mac",
            "includePath": [
                "${workspaceFolder}/**",
                "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/**"
            ],
            "defines": [],
            "macFrameworkPath": [],
            "compilerPath": "/usr/local/bin/clang",
            "cStandard": "c11",
            "cppStandard": "c++17",
            "intelliSenseMode": "clang-x64"
        }
    ],
    "version": 4
}

これで赤線が消えた。補完や定義ジャンプ、コードフォーマッタも効いている。

Debug

F5でStart Debuggingすると .vscode/tasks.json.vscode/launch.json が生成され、ビルド後デバッグが始まる。

$ cat .vscode/tasks.json
{
    "tasks": [
        {
            "type": "shell",
            "label": "clang++ build active file",
            "command": "/usr/bin/clang++",
            "args": [
                "-g",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}"
            ],
            "options": {
                "cwd": "/usr/bin"
            }
        }
    ],
    "version": "2.0.0"
}

$ cat .vscode/launch.json
{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "clang++ build and debug active file",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}/${fileBasenameNoExtension}",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "lldb",
            "preLaunchTask": "clang++ build active file"
        }
    ]
}

Debug中

bits/stdc++.h

競プロで使われる全部入りHeader bits/stdc++.h はclangでは提供されていないので、gcc(g++)でビルドするかgccのheaderを持ってくる。 includePathに含めたところ、いくつかの依存Headerが見つからなかったので、コピーしてきてそれらを除く必要があった。

$ brew install [email protected]
$ gcc-8 -v
gcc version 8.3.0 (Homebrew GCC 8.3.0_2)

$ cp /usr/local/Cellar/[email protected]/8.3.0_2/include/c++/8.3.0/x86_64-apple-darwin18/bits/stdc++.h .

参考

macOS Catalina(10.15) の Xcode11 だと /usr/include が無い - Qiita