Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

使用 Docker 運行最新版本 GCC 的完整指南

方法一:使用官方 GCC Docker 映像檔(推薦)

1. 建立 Dockerfile

# 使用最新版本的 GCC 官方映像檔
FROM gcc:15

# 設置工作目錄
WORKDIR /app

# 更新套件管理器並安裝必要工具
RUN apt-get update && apt-get install -y \
    vim \
    nano \
    gdb \
    make \
    cmake \
    && rm -rf /var/lib/apt/lists/*

# 建立程式碼目錄
RUN mkdir -p /app/src

# 設置環境變數
ENV CC=gcc
ENV CXX=g++

# 預設命令
CMD ["bash"]

2. 建立測試程式

建立一個簡單的 C++ 程式來測試:

hello.cpp

#include <iostream>
#include <vector>
#include <string>

int main() {
    std::vector<std::string> messages = {
        "Hello from GCC 15!",
        "C++17 is the default standard",
        "Docker + GCC = 🚀"
    };
    
    for (const auto& msg : messages) {
        std::cout << msg << std::endl;
    }
    
    // 顯示 GCC 版本
    std::cout << "\nCompiled with GCC version: " << __VERSION__ << std::endl;
    
    return 0;
}

3. 建立並運行容器

# 建立 Docker 映像檔
docker build -t gcc-dev .

# 運行容器(掛載當前目錄到容器內)
docker run -it -v $(pwd):/app/src gcc-dev

# 或者在 Windows PowerShell 中
docker run -it -v ${PWD}:/app/src gcc-dev

4. 在容器內編譯和運行

# 進入容器後,切換到源碼目錄
cd /app/src

# 編譯 C++ 程式
g++ -std=c++17 -O2 -Wall -Wextra hello.cpp -o hello

# 運行程式
./hello

# 檢查 GCC 版本
gcc --version
g++ --version

方法二:從源碼編譯 GCC 15(進階用法)

1. 進階 Dockerfile

# 使用 Ubuntu 作為基礎映像檔
FROM ubuntu:22.04

# 設置非互動模式
ENV DEBIAN_FRONTEND=noninteractive

# 安裝建構依賴
RUN apt-get update && apt-get install -y \
    build-essential \
    wget \
    curl \
    tar \
    xz-utils \
    libgmp-dev \
    libmpfr-dev \
    libmpc-dev \
    libisl-dev \
    zlib1g-dev \
    && rm -rf /var/lib/apt/lists/*

# 設置工作目錄
WORKDIR /tmp

# 下載並編譯 GCC 15.1
RUN wget https://ftp.gnu.org/gnu/gcc/gcc-15.1.0/gcc-15.1.0.tar.xz \
    && tar -xf gcc-15.1.0.tar.xz \
    && cd gcc-15.1.0 \
    && ./contrib/download_prerequisites \
    && mkdir build \
    && cd build \
    && ../configure \
        --prefix=/usr/local/gcc-15 \
        --enable-languages=c,c++,fortran \
        --disable-multilib \
        --with-system-zlib \
    && make -j$(nproc) \
    && make install \
    && cd / \
    && rm -rf /tmp/gcc-15.1.0*

# 設置環境變數
ENV PATH="/usr/local/gcc-15/bin:${PATH}"
ENV LD_LIBRARY_PATH="/usr/local/gcc-15/lib64:${LD_LIBRARY_PATH}"

# 建立工作目錄
WORKDIR /app

# 預設命令
CMD ["bash"]

方法三:使用 docker-compose(推薦用於開發)

1. 建立 docker-compose.yml

version: '3.8'

services:
  gcc-dev:
    build: .
    container_name: gcc-dev-container
    volumes:
      - .:/app/src
      - gcc-cache:/root/.cache
    working_dir: /app/src
    tty: true
    stdin_open: true
    environment:
      - CC=gcc
      - CXX=g++
      - MAKEFLAGS=-j$(nproc)

volumes:
  gcc-cache:

2. 使用 docker-compose 運行

# 建立並啟動容器
docker-compose up -d

# 進入容器
docker-compose exec gcc-dev bash

# 停止容器
docker-compose down

常用編譯指令

基本編譯

# 編譯 C 程式
gcc -std=c17 -O2 -Wall -Wextra program.c -o program

# 編譯 C++ 程式
g++ -std=c++17 -O2 -Wall -Wextra program.cpp -o program

# 編譯 C++23 程式(實驗性功能)
g++ -std=c++23 -O2 -Wall -Wextra program.cpp -o program

除錯編譯

# 包含除錯資訊
g++ -std=c++17 -g -Wall -Wextra program.cpp -o program

# 使用 GDB 除錯
gdb ./program

效能優化編譯

# 高度優化
g++ -std=c++17 -O3 -march=native -Wall -Wextra program.cpp -o program

# 連結時優化
g++ -std=c++17 -O3 -flto -Wall -Wextra program.cpp -o program

建議的專案結構

my-cpp-project/
├── Dockerfile
├── docker-compose.yml
├── src/
│   ├── main.cpp
│   ├── utils.cpp
│   └── utils.h
├── tests/
│   └── test_main.cpp
├── Makefile
└── README.md

範例 Makefile

CXX = g++
CXXFLAGS = -std=c++17 -O2 -Wall -Wextra
TARGET = app
SRCDIR = src
SOURCES = $(wildcard $(SRCDIR)/*.cpp)
OBJECTS = $(SOURCES:.cpp=.o)

$(TARGET): $(OBJECTS)
	$(CXX) $(OBJECTS) -o $(TARGET)

%.o: %.cpp
	$(CXX) $(CXXFLAGS) -c $< -o $@

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

.PHONY: clean

快速開始腳本

建立一個 start.sh 腳本:

#!/bin/bash

# 建立並運行 GCC 開發環境
echo "正在建立 GCC 開發環境..."
docker build -t gcc-dev .

echo "正在啟動容器..."
docker run -it -v $(pwd):/app/src gcc-dev

echo "環境已準備完成!"

使用方法:

chmod +x start.sh
./start.sh

這樣你就可以在 Docker 容器中使用最新版本的 GCC 15.1 來編譯和運行 C/C++ 程式了!