次の boost を使った簡単な線形代数のサンプルプログラム(ここでは main.cpp というファイル名に書かれているものとする)を実行・デバッグできることをゴールとして環境構築を行う。

#include <boost/numeric/ublas/io.hpp>
#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/vector.hpp>
#include <iostream>
#include <vector>

using namespace boost::numeric::ublas;

/* "y = Ax" example */
int main() {
    vector<double> x(2);
    x(0) = 1;
    x(1) = 2;

    matrix<double> A(2, 2);
    A(0, 0) = 0;
    A(0, 1) = 1;
    A(1, 0) = 2;
    A(1, 1) = 3;

    vector<double> y = prod(A, x);

    std::cout << y << std::endl;
    return 0;
}

M1 Mac

gdb は M1 Mac に対応していないため、clang + lldb を使って、C++ のデバッグ環境を整える。 clang は プログラムを LLVM 上で動作させるためのコンパイラであり、lldb は LLVM や clang パーサーを利用したデバッガーである。

補完用ファイルの作成 (.vscode/c_cpp_properties.json)

まずは vscode の IntelliSense を活用するために c_cpp_properties.json の設定を行おう。 cmd + shift + p でコマンドパレットを開き、C/C++: Edit Configurations (JSON) をクリックする。 すると、.vscode/c_cpp_properties.json が自動生成される。 ここで、プログラム開発に使いたいライブラリの path を includePath に追加する必要があることに注意しよう。

{
    "env": {
        "myDefaultIncludePath": [
            "${workspaceFolder}"
        ],
        "myCompilerPath": "/usr/bin/clang"
    },
    "configurations": [
        {
            "name": "Mac",
            "intelliSenseMode": "clang-x64",
            "includePath": [
                "${myDefaultIncludePath}",
                "{boost の IncludePath を記入}"
            ],
            "macFrameworkPath": [
                "/System/Library/Frameworks"
            ],
            "defines": [],
            "forcedInclude": [],
            "compilerPath": "/usr/bin/clang",
            "cStandard": "c11",
            "cppStandard": "c++17",
            "browse": {
                "path": [
                    "${workspaceFolder}"
                ],
                "limitSymbolsToIncludedHeaders": true,
                "databaseFilename": ""
            }
        }
    ],
    "version": 4
}

ビルド用ファイルの作成 (.vscode/tasks.json)

次に、毎回コマンドラインでビルドコマンドを実行するのは面倒なので、vscode 側でショートカットキーを押せばビルドされるように設定しておこう

cmd + shift + p を押すと次のような画面が出るので、ここで C/C++: C/C++ ファイルの実行 をクリックする。

mac vscode 1

すると次の画面に推移するので、ここで C/C++: clang++ アクティブファイルのビルドとデバッグ をクリックする。

mac vscode 2

すると、プロジェクト直下の .vscode ディレクトリの中に tasks.json ファイルが生成される。

{boost の includePath}{boost の libPath} は各々が設定すること。

{
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C++: clang++ アクティブなファイルのビルド",
            "command": "/usr/bin/clang++",
            "args": [
                "-fcolor-diagnostics",
                "-fansi-escape-codes",
                "--std=c++17",
                "-I{boost の includePath}",
                "-L{boost の libPath}",
                "-g",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}"
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "デバッガーによって生成されたタスク。"
        }
    ],
    "version": "2.0.0"
}

このファイルを用意した後に、main.cpp を開きながら cmd + shift + b を打つと tasks.json の内容に従ってコンパイルが走る。

デバッグ用のファイル作成 (.vscode/launch.json )

cmd + shift + p を押すと次のような画面が出るので、ここで C/C++: デバッグ構成の追加 を選択する。

mac vscode 3

次に C/C++: clang++ アクティブファイルのビルドとデバッグ を選択する。

mac vscode 4

すると、.vscode/launch.json が作成される。

ここで、program フィールドに tasks.json で設定したビルドで生成される実行ファイルを指定すること。

{
    "configurations": [
        {
            "name": "C/C++: clang++ アクティブ ファイルのビルドとデバッグ",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/main.out",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "lldb",
            "preLaunchTask": "C/C++: clang++ アクティブなファイルのビルド"
        }
    ],
    "version": "2.0.0"
}

ここまでくると、適当な行にブレークポイントを打って fn + F5 を押すか、もしくはvscode の左パネルについている Run and Debug の再生ボタンをクリックしてデバッグを開始してみよう。

WSL

TODO

[余談] C++ のライブラリのインストール

どういう状況を想定しているかを予め書いておこう。 基本的には、

  • C++ のパッケージ管理は使わない(興味はあるが、それは別記事にまとめたい。vcpkg とかはすごく便利そうだ。)
  • インストールしたいライブラリは、ソースファイルから直接 make でビルドする
  • ユーザディレクトリのどこか (今回は $HOME/cpp_lib) にライブラリをインストールする

の3つに従う。

建前を述べたところで、良く使いそうなライブラリをいくつかインストールしてみよう。

boost

Boostライブラリのビルド方法 がよくまとまっていて、基本的にここの手順通りにやれば良い。

git clone --recursive [email protected]:boostorg/boost.git # 時間がかかる
cd boost
./bootstrap.sh
./b2 install -j8 --prefix=$HOME/cpp_lib

eigen

インストールしたいバージョンが異なる場合は適宜変える必要がある。

wget https://gitlab.com/libeigen/eigen/-/archive/3.4.0/eigen-3.4.0.tar.gz
tar -zxvf eigen-3.4.0.tar.gz
cd eigen-3.4.0
mkdir build
cd build
cmake .. -DCMAKE_INSTALL_PREFIX=$HOME/cpp_lib
make install j8

nlohmann-json

インストールしたい バージョンが異なる場合は https://github.com/nlohmann/json/tags を確認して変える必要がある。

wget https://github.com/nlohmann/json/archive/refs/tags/v3.11.2.tar.gz
tar -zxvf v3.11.2.tar.gz
cd json-3.11.2
mkdir build
cd build
cmake .. -DCMAKE_INSTALL_PREFIX=$HOME/cpp_lib
make install j8

参考