Skip to content

Ch 3: 开发环境搭建

  • 安装支持 C++20 的编译器
  • 理解 CMake 构建系统
  • 配置 IDE(VS Code 或 CLion)
  • 创建第一个 C++ 项目
  • 掌握常用编译选项

C++ 代码需要编译器将源代码转换为机器码。主流编译器有 GCC、Clang 和 MSVC。

macOS 自带 Clang 编译器,但需要确保版本支持 C++20:

Terminal window
# 安装 Xcode 命令行工具(如果还没安装)
xcode-select --install
# 验证 Clang 版本
clang++ --version
# Apple clang version 15.0.0+
# 注意:Apple Clang 版本号与上游 LLVM 版本不同
# 支持大部分 C++20 特性

升级 Clang(可选):

Terminal window
# 使用 Homebrew 安装新版 LLVM
brew install llvm
# 验证新版 LLVM
/opt/homebrew/opt/llvm/bin/clang++ --version
# 或使用 GCC
brew install gcc
g++-13 --version
Terminal window
# 安装 GCC 11 或更新版本
sudo apt update
sudo apt install build-essential g++-11
# 验证版本
g++-11 --version
# g++-11 (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
# 设置为默认(可选)
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-11 100

CentOS/RHEL/Fedora:

Terminal window
# CentOS 8+
sudo dnf install gcc-c++
# 或从 Developer Toolset
sudo dnf install centos-release-scl
sudo dnf install devtoolset-11-gcc devtoolset-11-gcc-c++
scl enable devtoolset-11 bash

选项 1:Visual Studio 2022(推荐)

  1. 下载 Visual Studio 2022 Community
  2. 安装时选择「使用 C++ 的桌面开发」
  3. MSVC(Microsoft Visual C++ Compiler)会自动安装
Terminal window
# 在 VS Developer Command Prompt 中
cl /std:c++20 /EHsc main.cpp

选项 2:MinGW-w64 + MSYS2

Terminal window
# 安装 MSYS2
# 下载 https://www.msys2.org/
# 在 MSYS2 MinGW x64 终端中
pacman -S mingw-w64-ucrt-x86_64-gcc
pacman -S mingw-w64-x86_64-cmake
pacman -S mingw-w64-x86_64-gdb
test_cpp20.cpp
#include <iostream>
#include <vector>
#include <ranges>
#include <concepts>
#include <format>
int main() {
// C++20: 范围库
std::vector<int> nums = {1, 2, 3, 4, 5};
auto result = nums
| std::views::filter([](int x) { return x % 2 == 0; })
| std::views::transform([](int x) { return x * x; });
std::cout << "Even squares: ";
for (int n : result) {
std::cout << n << " ";
}
std::cout << std::endl;
// C++20: concepts
std::cout << std::format("PI: {:.4f}", 3.14159) << std::endl;
return 0;
}

编译测试:

Terminal window
# 使用 Clang
clang++ -std=c++20 test_cpp20.cpp -o test
# 使用 GCC
g++-11 -std=c++20 test_cpp20.cpp -o test
# 使用 MSVC
cl /std:c++20 /EHsc test_cpp20.cpp /Fe:test.exe

CMake 是 C++ 项目的事实标准构建系统。它用简洁的脚本生成平台特定的构建文件。

Terminal window
# 无 CMake:手动编译多个文件
g++ -std=c++20 -I./include -O2 src/main.cpp src/utils.cpp src/math.cpp -o app
# 问题:
# 1. 修改文件后要手动重新编译
# 2. 跨平台需要写多套脚本
# 3. 复杂项目的依赖管理困难
# CMake:声明式构建
cmake_minimum_required(VERSION 3.16)
project(MyApp LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 20)
add_executable(myapp src/main.cpp src/utils.cpp src/math.cpp)
my_project/
├── CMakeLists.txt # CMake 配置文件
├── src/ # 源代码
│ ├── main.cpp
│ ├── utils.cpp
│ └── math.cpp
├── include/ # 头文件
│ ├── utils.h
│ └── math.h
├── tests/ # 测试(可选)
│ └── test_utils.cpp
├── build/ # 构建输出(不要提交到 git)
│ └── ...
└── CMakePresets.json # CMake 预设(可选)
CMakeLists.txt
cmake_minimum_required(VERSION 3.16) # CMake 最低版本要求
# 项目信息
project(
TemperatureConverter
VERSION 1.0.0
DESCRIPTION "Temperature conversion tool"
LANGUAGES CXX
)
# C++ 标准
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON) # 如果编译器不支持,报错
set(CMAKE_CXX_EXTENSIONS OFF) # 使用标准语法,不用扩展
# 源文件
add_executable(temp_converter
src/main.cpp
)
Terminal window
# 1. 创建构建目录(重要!不要在源码目录构建)
mkdir build
cd build
# 2. 配置 CMake(生成构建文件)
cmake .. # Unix/macOS 生成 Makefile
# Windows 可用 Visual Studio 项目
# 或者指定构建类型
cmake -DCMAKE_BUILD_TYPE=Debug ..
cmake -DCMAKE_BUILD_TYPE=Release ..
# 3. 编译
cmake --build . # 构建所有目标
cmake --build . --target temp_converter # 构建特定目标
# 或直接用 make
make
# 4. 运行
./temp_converter 100 C
类型优化调试信息用途
Debug无 (-O0)有 (-g)开发调试
Release最高 (-O3)无生产部署
RelWithDebInfo较高 (-O2)有性能分析
MinSizeRel优化大小 (-Os)无嵌入式
Terminal window
mkdir -p temp_converter/src
cd temp_converter
cmake_minimum_required(VERSION 3.16)
project(TempConverter VERSION 1.0.0 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_executable(temp_converter src/main.cpp)
# 导出编译命令(用于 IDE 和工具)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
src/main.cpp
#include <iostream>
#include <string>
#include <stdexcept>
#include <cstdlib>
#include <cmath>
// 温度转换函数
double celsius_to_fahrenheit(double celsius) {
return celsius * 9.0 / 5.0 + 32.0;
}
double fahrenheit_to_celsius(double fahrenheit) {
return (fahrenheit - 32.0) * 5.0 / 9.0;
}
double celsius_to_kelvin(double celsius) {
return celsius + 273.15;
}
double kelvin_to_celsius(double kelvin) {
return kelvin - 273.15;
}
// 打印帮助
void print_help(const char* program_name) {
std::cout << "用法: " << program_name << " <温度> <单位>" << std::endl;
std::cout << "单位: C=摄氏, F=华氏, K=开尔文" << std::endl;
std::cout << "示例: " << program_name << " 100 C" << std::endl;
}
int main(int argc, char* argv[]) {
// 检查参数
if (argc != 3) {
print_help(argv[0]);
return 1;
}
// 解析参数
double temp;
try {
temp = std::stod(argv[1]); // 字符串转 double
} catch (const std::exception& e) {
std::cerr << "错误: 无效的温度值 '" << argv[1] << "'" << std::endl;
return 1;
}
char unit = argv[2][0]; // 获取第一个字符
try {
switch (unit) {
case 'C':
case 'c': {
double f = celsius_to_fahrenheit(temp);
double k = celsius_to_kelvin(temp);
std::cout << temp << "°C = " << f << "°F = " << k << "K" << std::endl;
break;
}
case 'F':
case 'f': {
double c = fahrenheit_to_celsius(temp);
double k = celsius_to_kelvin(c);
std::cout << temp << "°F = " << c << "°C = " << k << "K" << std::endl;
break;
}
case 'K':
case 'k': {
if (temp < 0) {
throw std::invalid_argument("开尔文温度不能低于绝对零度");
}
double c = kelvin_to_celsius(temp);
double f = celsius_to_fahrenheit(c);
std::cout << temp << "K = " << c << "°C = " << f << "°F" << std::endl;
break;
}
default:
throw std::invalid_argument(std::string("不支持的单位: ") + unit);
}
} catch (const std::exception& e) {
std::cerr << "错误: " << e.what() << std::endl;
return 1;
}
return 0;
}
Terminal window
# 创建 build 目录
mkdir build
cd build
# 配置
cmake ..
# 构建
cmake --build .
# 测试
./temp_converter 100 C
# 输出: 100°C = 212°F = 373.15K
./temp_converter 32 F
# 输出: 32°F = 0°C = 273.15K
./temp_converter 0 K
# 输出: 0K = -273.15°C = -459.67°F

必需扩展:

  • C/C++ (Microsoft) - C/C++ 语言支持
  • CMake Tools (Microsoft) - CMake 集成
  • C++ Intellisense (可选,更好的补全)

安装扩展后:

  1. 打开项目文件夹
  2. VS Code 自动检测 CMakeLists.txt
  3. 点击底部状态栏的 “No Kit Selected”
  4. 选择编译器(Clang/GCC/MSVC)
  5. 点击 “Build” 编译

配置文件:

.vscode/c_cpp_properties.json
{
"configurations": [
{
"name": "Mac",
"compilerPath": "/usr/bin/clang++",
"cppStandard": "c++20",
"intelliSenseMode": "macos-clang-arm64",
"includePath": ["${workspaceFolder}/**"]
},
{
"name": "Linux",
"compilerPath": "/usr/bin/g++-11",
"cppStandard": "c++20",
"intelliSenseMode": "linux-gcc-x64"
},
{
"name": "Windows",
"compilerPath": "C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/*/bin/Hostx64/x64/clang++",
"cppStandard": "c++20",
"intelliSenseMode": "windows-clang-x64"
}
]
}
.vscode/settings.json
{
"cmake.configureOnOpen": true,
"cmake.buildDirectory": "${workspaceFolder}/build",
"C_Cpp.default.cppStandard": "c++20",
"files.associations": {
"*.cpp": "cpp",
"*.h": "cpp"
}
}

JetBrains CLion 是专门为 C/C++ 设计的 IDE:

  1. File → Open → 选择项目根目录
  2. CLion 自动识别 CMakeLists.txt
  3. 直接运行 main.cpp 或构建项目
  4. 内置调试器、性能分析器
  1. File → Open → CMake
  2. 选择项目根目录的 CMakeLists.txt
  3. 选择运行目标,点击运行
Terminal window
# C++ 标准
-std=c++20 # C++20(本书主要使用)
-std=c++17 # C++17
-std=c++14 # C++14
-std=c++11 # C++11
# 示例
clang++ -std=c++20 main.cpp -o main
g++ -std=c++20 -O3 main.cpp -o main
Terminal window
# 优化选项
-O0 # 无优化(默认 Debug)
-O1 # 基本优化,编译快
-O2 # 较高优化(Release 默认)
-O3 # 激进优化
-Ofast # 最激进(包含 -O3 和 fast-math)
# 示例:发布构建
clang++ -O3 -std=c++20 -Wall -Wextra main.cpp -o main
Terminal window
# 警告选项
-Wall # 启用所有常见警告
-Wextra # 额外警告
-Wpedantic # 严格遵循 ISO C++
-Werror # 把警告当错误处理
-Weverything # 启用所有警告(包括不推荐的)
# 示例
clang++ -Wall -Wextra -Werror main.cpp -o main
Terminal window
# 调试符号
-g # 生成调试信息(默认 Debug)
-g3 # 包含宏定义的调试信息
Terminal window
# 开发构建
clang++ -std=c++20 -g -O0 -Wall -Wextra -fsanitize=address,undefined \
main.cpp -o main_debug
# 发布构建
clang++ -std=c++20 -O3 -Wall -Wextra \
main.cpp -o main_release
# 性能分析构建
clang++ -std=c++20 -O2 -g -pg \
main.cpp -o main_profile
cmake_minimum_required(VERSION 3.16)
project(MyApp)
# 包含目录
target_include_directories(myapp PRIVATE
${PROJECT_SOURCE_DIR}/include
)
# 查找库
find_package(Threads REQUIRED) # 查找线程库
# 链接库
target_link_libraries(myapp PRIVATE Threads::Threads)
cmake_minimum_required(VERSION 3.16)
project(MyLibrary)
# 库
add_library(mylib STATIC
src/lib.cpp
)
target_include_directories(mylib PUBLIC
${PROJECT_SOURCE_DIR}/include
)
# 可执行文件
add_executable(myapp src/main.cpp)
target_link_libraries(myapp PRIVATE mylib)
# 启用测试
enable_testing()
# 测试可执行文件
add_executable(test_math tests/test_math.cpp)
target_link_libraries(test_math PRIVATE mylib)
add_test(NAME MathTests COMMAND test_math)
  • macOS 用 Xcode Command Line Tools(Clang),Linux 用 GCC 11+
  • CMake 是 C++ 项目的标准构建系统
  • 始终在 build/ 目录构建,不要污染源码
  • VS Code + CMake Tools 或 CLion 是推荐的 IDE
  • -std=c++20 启用 C++20 标准
  • -O2/-O3 用于发布构建,-Wall -Wextra 开启所有警告

下章预告:ch04 解析第一个 C++ 程序的每个细节,理解 main() 函数和基本结构。