WSL2(Ubuntu)環境でC言語やC++言語のプログラムをコンパイルする際、コンパイラの指定を誤ってエラーが発生したため、その原因と正しいコマンドをメモします。
前提条件と開発環境の準備
UbuntuでC/C++のビルドを行うためには、build-essentialパッケージ(gcc、g++、makeなどを含むメタパッケージ)をインストールしておく必要があります。
sudo apt update sudo apt install -y build-essential
C++のコードをgccでコンパイルしようとして発生したエラー
以下のようなC++のサンプルコード(test.cpp)を作成しました。
#include <iostream>
int main(void) {
std::cout << "Hello, WSL2!" << < std::endl;
return 0;
}
これをいつものように gcc コマンドでコンパイルしようとしたところ、以下のようなリンカエラー(undefined reference)が発生しました。
$ gcc test.cpp /usr/bin/ld: /tmp/ccXXXXXX.o: in function `__static_initialization_and_destruction_0(int, int)': test.cpp:(.text+0x38): undefined reference to `std::ios_base::Init::Init()' /usr/bin/ld: test.cpp:(.text+0x4d): undefined reference to `std::ios_base::Init::~Init()' collect2: error: ld returned 1 exit status
原因と解決策
原因: gcc コマンドはC言語用のコンパイルドライバであるため、C++の標準ライブラリ(libstdc++など)が自動でリンクされず、C++の機能(iostream や標準ライブラリの初期化処理など)で未定義参照エラーになります。
解決策: C++のソースコードをコンパイルする場合は、C++用のコンパイルドライバである g++ を使用します。
$ g++ test.cpp -o test
実行ファイルが無事に生成され、実行できるようになります。
$ ./test Hello, WSL2!
C言語(.c)は gcc、C++言語(.cpp)は g++ を使うという基本を再確認する良い機会になりました。
この記事の更新履歴
この記事は、生成AIを活用した自動レビュー・更新フローにより内容を見直し、必要な修正を反映しています。
2026年9月12日
- 変更記事タイトルの「Ubuntsu」を「Ubuntu」に修正しました。
- 追加gccとg++の使い分けに関する解説と、簡単なコンパイル・実行手順を追加しました。

