">
FlatIsleロゴ

Flat Isle 日誌

VSCode+Raspberry PiでGCC開発環境構築2

2022-07-08

前回は Visual Studio Code(以降VSCode)から Raspberry Piに接続するところまで進めました
今回は、 GCCのコンパイル環境及びデバッグ環境の作成を行っていきます
使い回しの出来るように、下記環境はコピー&ペーストで出来るようにしています
各ファイルの詳細は解説で行います

ディレクトリ構成

📁(プロジェクト ルートディレクトリ) 📁.vscode 📝c_cpp_properties.json 📝tasks.json 📝launch.json 📁include 📝(プログラムヘッダ) 📝Makefile 📝(プログラムソース)

Makefileの作成

以下のテキストを”Makefile”として保存します
本Makefileは他のプロジェクトとの使い回しが出来る様に、実行ファイル名を”dbgApp”に固定しています

# Makefile for Raspberry Pi
CXX       = g++
CFLAGS    = -DSTANDALONE -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS \
			-DTARGET_POSIX -D_LINUX -DPIC -D_REENTRANT -D_LARGEFILE64_SOURCE \
			-D_FILE_OFFSET_BITS=64 -U_FORTIFY_SOURCE -DHAVE_LIBOPENMAX=2 -DOMX \
			-DOMX_SKIP64BIT -ftree-vectorize -pipe -DUSE_EXTERNAL_OMX \
			-DHAVE_LIBBCM_HOST -DUSE_EXTERNAL_LIBBCM_HOST -DUSE_VCHIQ_ARM \
			-fPIC -ftree-vectorize -pipe -Werror -g -Wall -DDEBUG
LDFLAGS   = -L/opt/vc/lib -lopenmaxil -lbcm_host -lvcos -lvchiq_arm -lpthread
LIBS      =
INCLUDES  = -I./include \
			-I/opt/vc/include \
			-I/opt/vc/include/interface/vcos/pthreads \
			-I/opt/vc/include/interface/vmcs_host/linux
TARGET    = ./bin/dbgApp
SRCDIR  = .
SOURCES   = $(wildcard $(SRCDIR)/*.cpp)
#*/
OBJDIR    = ./obj
OBJECTS   = $(addprefix $(OBJDIR)/, $(notdir $(SOURCES:.cpp=.o)))

$(TARGET): $(OBJECTS) $(LIBS)
	-mkdir -p ./bin
	$(CXX) -o $@ $^ $(LDFLAGS)

$(OBJDIR)/%.o: $(SRCDIR)/%.cpp
	-mkdir -p ./obj
	$(CXX) $(CFLAGS) $(INCLUDES) -o $@ -c $< -Wno-deprecated-declarations

.PHONY: all

clean:
	rm -f $(TARGET) $(OBJECTS)

all: clean $(TARGET)

/opt/vc/src/hello_pi/Makefile.include

シンプルで応用の効くmakefileとその解説

VSCodeの環境設定

「.vscode」フォルダ下に下記3つの設定ファイルを作成します

C,C++環境設定

下記内容を「c_cpp_properties.json」の名前で保存します

{
    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                "${workspaceFolder}/**",
                "/opt/vc/include/**"
            ],
            "defines": [],
            "compilerPath": "/usr/bin/gcc",
            "cStandard": "gnu17",
            "cppStandard": "gnu++14",
            "intelliSenseMode": "linux-gcc-arm"
        }
    ],
    "version": 4
}

タスクの構成

下記内容を「tasks.json」の名前で保存します

{
	"tasks": [
		{
			"type": "shell",
			"label": "make debug",
			"command": "make",
			"args": [],
			"options": {
				"cwd": "${fileDirname}"
			},
			"group": {
				"kind": "build",
				"isDefault": true
			},
		}
	],
	"version": "2.0.0"
}

デバッグ環境設定

下記内容を「launch.json」の名前で保存します

{
	"version": "0.2.0",
	"configurations": [
		{
			"name": "gcc - makeとデバッグ",
			"type": "cppdbg",
			"request": "launch",
			"program": "${fileDirname}/bin/dbgApp",
			"args": [],
			"stopAtEntry": false,
			"cwd": "${fileDirname}",
			"environment": [],
			"externalConsole": false,
			"MIMode": "gdb",
			"setupCommands": [
				{
					"description": "gdb の再フォーマットを有効にする",
					"text": "-enable-pretty-printing",
					"ignoreFailures": true
				}
			],
			"preLaunchTask": "make debug",
			"miDebuggerPath": "/usr/bin/gdb"
		}
	]
}

コンパイル&実行

コンパイル及び実行には、[実行]ー[デバッグの開始]又は、[F5]キーで開始します
また、ソースコード上の一時中断させたい行で、 [実行]ー[ブレークポイントの切り替え]又は、[F9]キーで ブレークポイントを設置できます

メモリダンプを見たい場合は、ウォッチ式に以下の様に記述します(「pointer」は参照する変数名)

*(char(*)[100])poionter,h

Visual Studio デバッガーでの書式指定子

解説

Makefile

内容
2使用するコンパイラの宣言
3~8コンパイルフラグ(hello_piのMakefile参照)
9リンク設定(hello_piのMakefile参照)
11~14インクルード先設定(hello_piのMakefile参照)
15実行ファイル(デバッグの為、ファイル名固定)
16~17コンパイル対象(ルートフォルダのcppを対象)
19~20中間ファイル出力先設定
22~28make実行部
30疑似タスク宣言
32,35初期化、全コンパイルタスク宣言

C,C++環境設定

[表示]―[コマンドパレット]の「C/C++構成の編集(UI)」で作成された 「c_cpp_properties.json」 に対し、以下の変更を加えています

内容
5~7VSCodeのインクルードフォルダ宣言(Raspberry Pi上のインクルード先を追加)

タスク構成

下記デバッグ環境設定で作成された「tasks.json」に対し、以下の変更を加えています

内容
4makeコマンドを実行するための「shell」を宣言
5タスク認識用の名前
6実行コマンド「make」

デバッグ環境設定

[実行]―[構成の追加]より、「C++(GDB/LLDB)」―「gcc – アクティブ ファイルのビルドとデバッグ」 で作成された 「launch.json」に対し、以下の変更を加えています

内容
5実行とデバッグ認識用の名前
8実行ファイル(デバッグの為、ファイル名固定)
22実行前のタスク指定(自動make実行)