Ch 3: 开发环境搭建
- 安装支持 C++20 的编译器
- 理解 CMake 构建系统
- 配置 IDE(VS Code 或 CLion)
- 创建第一个 C++ 项目
- 掌握常用编译选项
3.1 选择编译器
Section titled “3.1 选择编译器”C++ 代码需要编译器将源代码转换为机器码。主流编译器有 GCC、Clang 和 MSVC。
3.1.1 macOS
Section titled “3.1.1 macOS”macOS 自带 Clang 编译器,但需要确保版本支持 C++20:
# 安装 Xcode 命令行工具(如果还没安装)xcode-select --install
# 验证 Clang 版本clang++ --version
# Apple clang version 15.0.0+# 注意:Apple Clang 版本号与上游 LLVM 版本不同# 支持大部分 C++20 特性升级 Clang(可选):
# 使用 Homebrew 安装新版 LLVMbrew install llvm
# 验证新版 LLVM/opt/homebrew/opt/llvm/bin/clang++ --version
# 或使用 GCCbrew install gccg++-13 --version3.1.2 Linux (Ubuntu/Debian)
Section titled “3.1.2 Linux (Ubuntu/Debian)”# 安装 GCC 11 或更新版本sudo apt updatesudo 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 100CentOS/RHEL/Fedora:
# CentOS 8+sudo dnf install gcc-c++
# 或从 Developer Toolsetsudo dnf install centos-release-sclsudo dnf install devtoolset-11-gcc devtoolset-11-gcc-c++scl enable devtoolset-11 bash3.1.3 Windows
Section titled “3.1.3 Windows”选项 1:Visual Studio 2022(推荐)
- 下载 Visual Studio 2022 Community
- 安装时选择「使用 C++ 的桌面开发」
- MSVC(Microsoft Visual C++ Compiler)会自动安装
# 在 VS Developer Command Prompt 中cl /std:c++20 /EHsc main.cpp选项 2:MinGW-w64 + MSYS2
# 安装 MSYS2# 下载 https://www.msys2.org/
# 在 MSYS2 MinGW x64 终端中pacman -S mingw-w64-ucrt-x86_64-gccpacman -S mingw-w64-x86_64-cmakepacman -S mingw-w64-x86_64-gdb3.1.4 验证 C++20 支持
Section titled “3.1.4 验证 C++20 支持”#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;}编译测试:
# 使用 Clangclang++ -std=c++20 test_cpp20.cpp -o test
# 使用 GCCg++-11 -std=c++20 test_cpp20.cpp -o test
# 使用 MSVCcl /std:c++20 /EHsc test_cpp20.cpp /Fe:test.exe3.2 CMake 构建系统
Section titled “3.2 CMake 构建系统”CMake 是 C++ 项目的事实标准构建系统。它用简洁的脚本生成平台特定的构建文件。
3.2.1 为什么需要 CMake
Section titled “3.2.1 为什么需要 CMake”# 无 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)3.2.2 项目结构
Section titled “3.2.2 项目结构”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 预设(可选)3.2.3 最小 CMakeLists.txt
Section titled “3.2.3 最小 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)3.2.4 编译项目
Section titled “3.2.4 编译项目”# 1. 创建构建目录(重要!不要在源码目录构建)mkdir buildcd 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 # 构建特定目标
# 或直接用 makemake
# 4. 运行./temp_converter 100 C3.2.5 CMake 构建类型
Section titled “3.2.5 CMake 构建类型”| 类型 | 优化 | 调试信息 | 用途 |
|---|---|---|---|
| Debug | 无 (-O0) | 有 (-g) | 开发调试 |
| Release | 最高 (-O3) | 无 | 生产部署 |
| RelWithDebInfo | 较高 (-O2) | 有 | 性能分析 |
| MinSizeRel | 优化大小 (-Os) | 无 | 嵌入式 |
3.3 第一个项目:温度转换器
Section titled “3.3 第一个项目:温度转换器”3.3.1 创建项目结构
Section titled “3.3.1 创建项目结构”mkdir -p temp_converter/srccd temp_converter3.3.2 CMakeLists.txt
Section titled “3.3.2 CMakeLists.txt”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)3.3.3 源代码
Section titled “3.3.3 源代码”#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;}3.3.4 编译和运行
Section titled “3.3.4 编译和运行”# 创建 build 目录mkdir buildcd 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°F3.4 IDE 配置
Section titled “3.4 IDE 配置”3.4.1 VS Code
Section titled “3.4.1 VS Code”必需扩展:
- C/C++ (Microsoft) - C/C++ 语言支持
- CMake Tools (Microsoft) - CMake 集成
- C++ Intellisense (可选,更好的补全)
安装扩展后:
- 打开项目文件夹
- VS Code 自动检测
CMakeLists.txt - 点击底部状态栏的 “No Kit Selected”
- 选择编译器(Clang/GCC/MSVC)
- 点击 “Build” 编译
配置文件:
{ "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" } ]}{ "cmake.configureOnOpen": true, "cmake.buildDirectory": "${workspaceFolder}/build", "C_Cpp.default.cppStandard": "c++20", "files.associations": { "*.cpp": "cpp", "*.h": "cpp" }}3.4.2 CLion
Section titled “3.4.2 CLion”JetBrains CLion 是专门为 C/C++ 设计的 IDE:
- File → Open → 选择项目根目录
- CLion 自动识别
CMakeLists.txt - 直接运行 main.cpp 或构建项目
- 内置调试器、性能分析器
3.4.3 Visual Studio (Windows)
Section titled “3.4.3 Visual Studio (Windows)”- File → Open → CMake
- 选择项目根目录的
CMakeLists.txt - 选择运行目标,点击运行
3.5 常用编译选项
Section titled “3.5 常用编译选项”3.5.1 标准版本
Section titled “3.5.1 标准版本”# 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 maing++ -std=c++20 -O3 main.cpp -o main3.5.2 优化级别
Section titled “3.5.2 优化级别”# 优化选项-O0 # 无优化(默认 Debug)-O1 # 基本优化,编译快-O2 # 较高优化(Release 默认)-O3 # 激进优化-Ofast # 最激进(包含 -O3 和 fast-math)
# 示例:发布构建clang++ -O3 -std=c++20 -Wall -Wextra main.cpp -o main3.5.3 警告和错误
Section titled “3.5.3 警告和错误”# 警告选项-Wall # 启用所有常见警告-Wextra # 额外警告-Wpedantic # 严格遵循 ISO C++-Werror # 把警告当错误处理-Weverything # 启用所有警告(包括不推荐的)
# 示例clang++ -Wall -Wextra -Werror main.cpp -o main3.5.4 调试信息
Section titled “3.5.4 调试信息”# 调试符号-g # 生成调试信息(默认 Debug)-g3 # 包含宏定义的调试信息3.5.5 完整示例
Section titled “3.5.5 完整示例”# 开发构建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_profile3.6 CMake 高级配置
Section titled “3.6 CMake 高级配置”3.6.1 包含目录和链接库
Section titled “3.6.1 包含目录和链接库”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)3.6.2 多目标构建
Section titled “3.6.2 多目标构建”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)3.6.3 测试配置
Section titled “3.6.3 测试配置”# 启用测试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() 函数和基本结构。