この記事の目的
- WSL とか Linux とかは詳しくなくても、とりあえず C/C++ のビルド&デバッグ環境を作る。
- 開発環境を仮想マシン内に構築することで、ローカル環境に依存しない環境を作る。
前提条件
-
Windows10 に VSCode がインストール済み
-
x64 システムの場合
Windows10 Version 1903 以降 / Build 18362 以上 -
ARM64 システムの場合
Windows10 Version 2004 以降 / Build 19041 以上
VSCode 拡張機能 : Remote Development のインストール
まずは今回の要ともいうべき拡張機能 Remote Development をインストールしておきましょう。この拡張機能は、下記 3 つの拡張機能をパッケージにしたものです。
インストールする拡張機能は最小限にしたい!という方は、Remote - WSL だけインストールしておけば大丈夫です。
WSL2 の利用準備
CPU 仮想化が有効になっていることを確認
[ タスクマネージャー ] > [ パフォーマンス ] の [ CPU ] 項目を開き、仮想化(下図の赤枠部分)が 有効 になっていることを確認。有効になっていない場合は CPU仮想化の確認 ( Windows10 ) を参考に設定を変更しておきましょう。
WSL ( Windows Subsystem for Linux ) の有効化
Windows PowerShell ( 管理者 ) を開き、下記コマンドを実行。
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
VMP ( Virtual Machine Platform ) の有効化
Windows PowerShell ( 管理者 ) を開き、下記コマンドを実行。
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
Linux カーネル更新プログラムのインストール
-
x64 システムの場合
wsl_update_x64.msi をインストール -
ARM64 システムの場合
wsl_update_arm64.msi をインストール
WSL の規定値を WSL2 に設定
Windows PowerShell ( 管理者 ) を開き、下記コマンドを実行。
wsl --set-default-version 2
Linux 上に開発環境を構築
インストール
Ubuntu 20.04 LTS ( Microsoft Store ) を開き、「入手」ボタンをクリックしてインストール。
他のディストリビューションを使用したい場合は、Microsoft 公式の 選択した Linux ディストリビューションをインストールする を参照してください。
起動
スタートメニューから Ubuntu 20.04 LTS を探して起動します。初回起動時のみユーザーの作成が求められるので、画面の指示に従って「ユーザー名」と「パスワード」を設定してください。
ここで作成するユーザーは、Windows のユーザーと一致させる必要はありません。
Installing, this may take a few minutes...
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username: slangsoft
New password:
Retype new password:
passwd: password updated successfully
システムアップデート
Linux システムを最新にするため、以下のコマンドを順に実行。パスワードの入力を求められるので、ユーザー作成時に設定したパスワードを入力してください。
プロキシ環境下の場合は、事前に Ubuntu 20.04 LTS のプロキシ設定まとめ を参考に設定しておきましょう。
sudo apt update
sudo apt upgrade -y
各種パッケージのインストール
必要なパッケージをまとめてインストールします。
sudo apt install cmake clang lldb llvm-dev liblldb-dev -y
Ubuntu
の lldb
パッケージには lldb-mi
が入っておらず、無効なエイリアスだけが残っているらしい。
ということで、一旦、無効なエイリアスを削除しておく。
sudo rm -f /usr/bin/lldb-mi
lldb-server
の起動に失敗する問題に対処するため、エイリアスを作成しておく。
sudo ln -s /usr/bin/lldb-server-10 /usr/bin/lldb-server-10.0.0
Ubuntu
用の lldb-mi
はバイナリが提供されていないため、自力でソースからビルドします。
git clone https://github.com/lldb-tools/lldb-mi.git
cd lldb-mi
cmake .
cmake --build .
sudo cp src/lldb-mi /usr/bin/
cd ..
Linux 上にプロジェクト用ディレクトリを作成
ここでは便宜的に TestProject
ディレクトリをホームディレクトリ直下に作成しています。
mkdir TestProject
VSCode を起動
カレントディレクトリを TestProject に変更。
cd TestProject
VSCode を起動。
以下のコマンドは Linux 上で実行しますが、VSCode は Windows10 側で起動します。
# VSCode Stable 版 ( 通常版 ) を利用する場合
code .
# VSCode insiders 版 ( プレビュー版 ) を利用する場合
code-insiders .
初回起動時は VS Code Server
のインストールプロセスが走るため、少しだけ時間がかかります。
Installing VS Code Server for x64 (e713fe9b05fc24facbec8f34fb1017133858842b)
Downloading: 100%
Unpacking: 100%
Unpacked 1952 files and folders to /home/slangsoft/.vscode-server/bin/e713fe9b05fc24facbec8f34fb1017133858842b.
VS Code Server
のインストールが完了すると、Windows10 側で VSCode が起動します。起動した VSCode の左下に WSL: Ubuntu-20.04
という表示が出ていることを確認しておきましょう。
Linux 側での操作は以上となりますので、ターミナルウィンドウは「×」ボタンで閉じても問題ありません。
C/C++ 開発に必要な VSCode 拡張機能のインストール
ここでは以下の拡張機能をインストールします。
拡張機能は Linux 側にインストールします。
Linux 側にインストールするには、いつもの Install
ボタンではなく、Install in WSL:<Distribution Name>
ボタンをクリックするだけです。
c_cpp_properties.json の作成
Ctrl+Shift+P
でコマンドパレットを開き、C/C++: Edit Configurations (JSON)
を実行します。
c_cpp_properties.json
が自動生成されます。
修正は必要ありませんので、そのまま閉じておきましょう。
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [],
"compilerPath": "/usr/bin/clang",
"cStandard": "c11",
"cppStandard": "c++14",
"intelliSenseMode": "linux-clang-x64",
"configurationProvider": "ms-vscode.cmake-tools"
}
],
"version": 4
}
CMake プロジェクトの作成
Ctrl+Shift+P
でコマンドパレットを開き、CMake: Quick Start
を実行
コンパイラは Clang
を選択
プロジェクト名 ( 好きな名前でOK ) を入力
生成対象は Executable
を選択
これで CMake プロジェクトの生成は完了です。
プロジェクトが以下の様な構成になっていることを確認しておきましょう。
[\\wsl$\Ubuntu-20.04\TestProject]
├─ [.vscode]
├─ [build]
├─ CMakeLists.txt
└─ main.cpp
動作確認用プログラムの作成
簡単な加減算プログラムを準備します。
ディレクトリ構成は、複数の SWC ( ソフトウェアコンポーネント ) が連携するソフトウェアを意識した構成にしています。
main.cpp
ファイルは不要なので削除しておきましょう。
[\\wsl$\Ubuntu-20.04\TestProject]
├─ [.vscode]
├─ [build]
+ ├─ [swc]
+ │ ├─ [swc_addition]
+ │ │ ├─ [inc]
+ │ │ │ └─ swc_addition.h
+ │ │ └─ [src]
+ │ │ └─ swc_addition.c
+ │ └─ [swc_subtraction]
+ │ ├─ [inc]
+ │ │ └─ swc_subtraction.h
+ │ └─ [src]
+ │ └─ swc_subtraction.c
├─ CMakeLists.txt
+ ├─ main.c
- └─ main.cpp
extern int func_addition ( int arg_a, int arg_b );
int func_addition ( int arg_a, int arg_b )
{
int result;
result = arg_a + arg_b;
return result;
}
extern int func_subtraction ( int arg_a, int arg_b );
int func_subtraction ( int arg_a, int arg_b )
{
int result;
result = arg_a - arg_b;
return result;
}
#include <stdio.h>
#include "swc/swc_addition/inc/swc_addition.h"
#include "swc/swc_subtraction/inc/swc_subtraction.h"
int main ()
{
int val_a, val_b;
int res_add, res_sub;
val_a = 10;
val_b = 20;
res_add = func_addition ( val_a, val_b );
res_sub = func_subtraction ( val_a, val_b );
printf ( "Result (addition) : %d.\n", res_add );
printf ( "Result (subtraction) : %d.\n", res_sub );
return 0;
}
ビルド&動作確認用プログラムの実行
SWC 用 CMakeLists.txt の新規作成
SWC 毎に CMakeLists.txt を作成し、それらをプロジェクトルートにある CMakeLists.txt で読み込む様に設定します。
[\\wsl$\Ubuntu-20.04\TestProject]
├─ [.vscode]
├─ [build]
├─ [swc]
│ ├─ [swc_addition]
│ │ ├─ [inc]
│ │ │ └─ swc_addition.h
│ │ └─ [src]
+ │ │ ├─ CMakeLists.txt
│ │ └─ swc_addition.c
│ └─ [swc_subtraction]
│ ├─ [inc]
│ │ └─ swc_subtraction.h
│ └─ [src]
+ │ ├─ CMakeLists.txt
│ └─ swc_subtraction.c
├─ CMakeLists.txt
└─ main.c
# 定数定義
set(SWC_NAME swc_addition)
# ファイルリスト生成
file(
GLOB
TARGET_FILES
RELATIVE
${CMAKE_CURRENT_SOURCE_DIR}
*.c
)
# ライブラリ生成
add_library(
${SWC_NAME}
SHARED
${TARGET_FILES}
)
# インクルードディレクトリ指定
target_include_directories(
${SWC_NAME}
INTERFACE
${PROJECT_SOURCE_DIR}/swc/${SWC_NAME}/inc
)
# 定数定義
set(SWC_NAME swc_subtraction)
# ファイルリスト生成
file(
GLOB
TARGET_FILES
RELATIVE
${CMAKE_CURRENT_SOURCE_DIR}
*.c
)
# ライブラリ生成
add_library(
${SWC_NAME}
SHARED
${TARGET_FILES}
)
# インクルードディレクトリ指定
target_include_directories(
${SWC_NAME}
INTERFACE
${PROJECT_SOURCE_DIR}/swc/${SWC_NAME}/inc
)
プロジェクト用 CMakeLists.txt の修正
赤文字部分は削除、緑文字部分を追加します。
cmake_minimum_required(VERSION 3.0.0)
project(TestProject VERSION 0.1.0)
include(CTest)
enable_testing()
- add_executable(TestProject main.cpp)
+ # サブディレクトリ登録
+ add_subdirectory(swc/swc_addition/src/)
+ add_subdirectory(swc/swc_subtraction/src/)
+ # 実行ファイル生成
+ add_executable(main.out main.c)
+ target_link_libraries(
+ main.out
+ swc_addition
+ swc_subtraction
+ )
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)
ビルドの実行
ステータスバーに表示されている「Build」ボタンをクリックすることでビルドを実行します。
OUTPUT ウィンドウに以下の様な出力が出れば成功です。
[main] Building folder: TestProject
[build] Starting build
[proc] Executing command: /usr/bin/cmake --build /home/slangsoft/TestProject/build --config Debug --target all -j 10 --
[build] -- Configuring done
[build] -- Generating done
[build] -- Build files have been written to: /home/slangsoft/TestProject/build
[build] [ 66%] Built target swc_subtraction
[build] [ 66%] Built target swc_addition
[build] Scanning dependencies of target main.out
[build] [ 83%] Building C object CMakeFiles/main.out.dir/main.c.o
[build] [100%] Linking C executable main.out
[build] [100%] Built target main.out
[build] Build finished with exit code 0
動作確認用プログラムの実行
ステータスバーに表示されている「Launch」ボタンをクリックすることでプログラムを実行します。
TERMINAL ウィンドウに以下の様な出力が出れば成功です。
slangsoft@DELL-PC:~/TestProject/build$ /home/slangsoft/TestProject/build/main.out
Result (addition) : 30.
Result (subtraction) : -10.
デバッグ
launch.json ファイルの新規作成
アクティビティバーから Run and Debug
を開き、create a launch.json file
をクリックします。
環境は LLDB
を選択
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": [
{
"type": "lldb",
"request": "launch",
"name": "Debug",
- "program": "${workspaceFolder}/<your program>",
+ "program": "${command:cmake.launchTargetPath}",
+ "console": "integratedTerminal",
"args": [],
"cwd": "${workspaceFolder}"
}
]
}
settings.json ファイルの新規作成
.vscode
フォルダ直下に settings.json
を新規に作成し、以下の内容を貼り付けて保存します。
{
"cmake.debugConfig": {
"stopAtEntry": false,
"MIMode": "lldb",
"miDebuggerPath": "/usr/bin/lldb-mi",
"logging": {
"trace": true,
"engineLogging": true,
"traceResponse": true
}
}
}
デバッグ実行
デバッグ実行そのものは一般的な IDE と同じ操作感で行うことができます。以下では swc_subtraction.c
の 4 行目にブレークポイントを設定しています。
最適化方法を指定するため、下図の赤枠部分をクリックします。
デバッグを行う際は Debug
を選択します。
デバッグの実行は、下図の赤枠部分をクリックするだけです。
ちゃんとブレークポイントで停止しました。