次の 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++ ファイルの実行
をクリックする。
すると次の画面に推移するので、ここで C/C++: clang++ アクティブファイルのビルドとデバッグ
をクリックする。
すると、プロジェクト直下の .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++: デバッグ構成の追加
を選択する。
次に C/C++: clang++ アクティブファイルのビルドとデバッグ
を選択する。
すると、.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