1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Kali Linuxでgccを使ったC++の開発環境構築

Posted at

Kali LinuxでC++23開発環境を構築するガイド【2025年版】

はじめに

セキュリティキャンプミニ山梨に参加をしたのですが、そこでC++の最新バージョンの環境が必要で研究室に設置しているパソコンをリモートで操作しようと思っていたのですがWIndowsのノートPCを持っていなかったのもあり、急遽手元にあったKali Linuxで環境構築を行ったので、せっかくなのでそのメモを残そうとして書いたメモです。

対象読者

  • Kali Linuxユーザー(Debian系)

前提条件

  • Kali Linux(本記事ではKali GNU/Linux Rolling 2025.3で検証)

目標

この記事では、以下の4つの検証コードがすべて正常に動作する環境を構築します:

  1. C++バージョン確認(出力: C++23
  2. std::print機能確認(出力: Hello, World!
  3. UTF-8文字セット確認(出力: デフォルトの文字セットは UTF-8
  4. 複数ファイルコンパイル確認(出力: OK + ファイル出力)

Step 1: 現在の環境確認

まず、現在のシステム情報とコンパイラの状況を確認します。

システム情報の確認

cat /etc/os-release

実行結果例:

PRETTY_NAME="Kali GNU/Linux Rolling"
NAME="Kali GNU/Linux"
VERSION_ID="2025.3"
VERSION="2025.3"
VERSION_CODENAME=kali-rolling
ID=kali
ID_LIKE=debian

既存のGCCバージョン確認

gcc --version

実行結果例:

gcc (Debian 14.3.0-5) 14.3.0
Copyright (C) 2024 Free Software Foundation, Inc.

現在のGCCは14.3.0で、C++23対応には不十分です。

Clangの確認

clang --version

初期状態では「コマンド 'clang' が見つかりません」と表示される場合があります。

補足: Debian表記について

  • KaliはDebian派生ディストリビューションです(/etc/os-release にも ID_LIKE=debian と出力されます)。そのため、gcc --version の表示にある gcc (Debian 15.x.y-*) や、clang --versionDebian clang version ... は、パッケージのビルド元を示す表記であり、OSがDebianであるという意味ではありません。
  • apt search では kali-rolling と表示され、配布元がKaliであることも確認できます。これらは矛盾ではなく、KaliがDebianをベースにしていることに由来した表記です。

Step 2: パッケージリストの更新

最新のパッケージ情報を取得します。

sudo apt update

実行例:

取得:1 https://packages.microsoft.com/repos/code stable InRelease [3,590 B]
取得:2 https://dl.google.com/linux/chrome/deb stable InRelease [1,825 B]
...
73.1 MB を 15秒 で取得しました (4,795 kB/s)
アップグレードできるパッケージが 467 個あります。

Step 3: GCC 15のインストール

C++23に対応するGCC 15をインストールします。

GCC 15の利用可能性確認

apt search "gcc-1[5-9]"

この出力でgcc-15/kali-rolling 15.2.0-1 amd64が表示されることを確認します。

GCC 15とg++-15のインストール

sudo apt install gcc-15 g++-15

実行中の出力例:

Installing:
  g++-15  gcc-15

Installing dependencies:
  cpp-15                   g++-15-x86-64-linux-gnu  libgcc-15-dev
  cpp-15-x86-64-linux-gnu  gcc-15-x86-64-linux-gnu  libstdc++-15-dev

Summary:
  Upgrading: 0, Installing: 8, Removing: 0, Not Upgrading: 467
  Download size: 249 MB
  Space needed: 1,047 MB / 128 GB available

Continue? [Y/n] Y

Yを入力してインストールを実行します。

インストール確認

gcc-15 --version

期待する出力:

gcc-15 (Debian 15.2.0-1) 15.2.0
Copyright (C) 2025 Free Software Foundation, Inc.
g++-15 --version

期待する出力:

g++-15 (Debian 15.2.0-1) 15.2.0
Copyright (C) 2025 Free Software Foundation, Inc.

Step 4: Clangのインストール(オプション)

追加の選択肢として、Clangもインストールします。

sudo apt install clang

インストール後の確認:

clang --version

期待する出力:

Debian clang version 19.1.7 (3+b2)
Target: x86_64-pc-linux-gnu
Thread model: posix

Step 5: 検証用ディレクトリの作成

テスト用のディレクトリ構造を作成します。

mkdir -p ~/Documents/Programing/security/yamanashi/cpp23-verification
cd ~/Documents/Programing/security/yamanashi/cpp23-verification

# 各テスト用のサブディレクトリを作成
mkdir test1-version-check
mkdir test2-stdprint  
mkdir test3-utf8
mkdir test4-multifile

Step 6: 検証コードの実装とテスト

検証① C++バージョン確認

ファイル作成:

cd test1-version-check
nano Main.cpp

Main.cpp の内容:

#include <iostream>

int main()
{
#if defined(_MSC_VER) // Visual Studio
	#if _MSVC_LANG < 201103L
		std::cout << "before C++11\n";
	#elif _MSVC_LANG == 201103L
		std::cout << "C++11\n";
	#elif _MSVC_LANG == 201402L
		std::cout << "C++14\n";
	#elif _MSVC_LANG == 201703L
		std::cout << "C++17\n";
	#elif _MSVC_LANG == 202002L
		std::cout << "C++20\n";
	#elif _MSVC_LANG == 202302L
		std::cout << "C++23\n";
	#elif 202302L < _MSVC_LANG 
		std::cout << "C++23 or later\n";
	#endif
#else // その他のコンパイラ
	#if __cplusplus < 201103L
		std::cout << "before C++11\n";
	#elif __cplusplus == 201103L
		std::cout << "C++11\n";
	#elif __cplusplus == 201402L
		std::cout << "C++14\n";
	#elif __cplusplus == 201703L
		std::cout << "C++17\n";
	#elif __cplusplus == 202002L
		std::cout << "C++20\n";
	#elif __cplusplus == 202302L
		std::cout << "C++23\n";
	#elif 202002L < __cplusplus
		std::cout << "C++23 or later\n";
	#endif
#endif
}

コンパイルと実行:

g++-15 -std=c++23 Main.cpp -o version_test
./version_test

期待する出力:

C++23

検証② std::print機能確認

ファイル作成:

cd ../test2-stdprint
nano Main.cpp

Main.cpp の内容:

#include <print>

int main()
{
	std::println("Hello, World!");
}

コンパイルと実行:

g++-15 -std=c++23 Main.cpp -o stdprint_test
./stdprint_test

期待する出力:

Hello, World!

検証③ UTF-8文字セット確認

ファイル作成:

cd ../test3-utf8
nano Main.cpp

Main.cpp の内容:

#include <iostream>
#include <cstring>

int main()
{
	// デフォルトの文字セット
	// Visual Studio のデフォルトは Shift_JIS なので、コンパイラオプションで UTF-8 に変更が必要
	const char s[] = "あいうえお";
	
	// UTF-8 エンコーディングが保証された文字列
	const char8_t u8[] = u8"あいうえお";

	// 2つのバイト配列のサイズと内容を比較し、完全に一致するかを調べる
	if ((sizeof(s) == sizeof(u8))
		&& (std::memcmp(s, u8, sizeof(s)) == 0))
	{
		std::cout << "デフォルトの文字セットは UTF-8\n";
	}
	else
	{
		std::cout << "デフォルトの文字セットが UTF-8 ではない\n";
	}
}

コンパイルと実行:

g++-15 -std=c++23 Main.cpp -o utf8_test
./utf8_test

期待する出力:

デフォルトの文字セットは UTF-8

検証④ 複数ファイルコンパイル確認

ヘッダーファイル作成:

cd ../test4-multifile
nano TextFile.hpp

TextFile.hpp の内容:

#pragma once
#include <string>

namespace mylib
{
	bool WriteTextFile(const std::string& path, const std::string& text);
}

実装ファイル作成:

nano TextFile.cpp

TextFile.cpp の内容:

#include <fstream>
#include "TextFile.hpp"

namespace mylib
{
	bool WriteTextFile(const std::string& path, const std::string& text)
	{
		std::ofstream file{ path };
		
		if (!file)
		{
			return false;
		}

		file << text;
		
		return true;
	}
}

メインファイル作成:

nano Main.cpp

Main.cpp の内容:

#include <iostream>
#include <string>
#include "TextFile.hpp"

int main()
{
	const std::string text = "Hello, World!";

	if (mylib::WriteTextFile("output.txt", text))
	{
		std::cout << "OK\n";
	}
	else
	{
		std::cout << "Failed\n";
	}
}

コンパイルと実行:

g++-15 -std=c++23 Main.cpp TextFile.cpp -o multifile_test
./multifile_test

期待する出力:

OK

ファイル出力確認:

cat output.txt

期待する出力:

Hello, World!

まとめ

構築完了した環境

  • OS: Kali GNU/Linux Rolling (2025.3)
  • コンパイラ: GCC 15.2.0(C++23対応)
  • 追加ツール: Clang 19.1.7

C++23プログラムのコンパイル方法

g++-15 -std=c++23 <ソースファイル名> -o <実行ファイル名>

利用可能なC++23の新機能例

  • std::printstd::println(フォーマット出力)
  • improved constexpr
  • deducing this
  • static operator()
  • その他多数の新機能

参考リンク


この記事は2025年9月20日時点の情報に基づいて作成したので最新の情報が欲しい方は別の方の記事を調べてください。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?