1. Ubuntu入门学习教程概述
作为一名在Linux环境下开发超过十年的老程序员,我见证了Ubuntu从6.06 LTS到22.04 LTS的演变历程。Ubuntu 22.04 LTS(Jammy Jellyfish)作为最新的长期支持版本,带来了诸多开发者友好的特性更新。这个系列教程将从零开始,带你系统掌握Ubuntu环境下的C/C++开发全流程。
为什么选择Ubuntu作为开发环境?根据2023年Stack Overflow开发者调查,Ubuntu以超过40%的使用率位居Linux发行版首位。其完善的软件仓库、稳定的LTS版本周期(5年支持)以及活跃的社区支持,使其成为C/C++开发的理想平台。特别是对于嵌入式开发、高性能计算等场景,Ubuntu更是行业标准选择。
2. Ubuntu 22.04基础环境配置
2.1 系统安装与初始化设置
从官网下载Ubuntu 22.04 LTS镜像时,建议选择带有"LTS"标识的版本。安装时注意分区方案:
- 根目录(/):至少30GB(建议50GB)
- swap分区:内存小于8G时设为内存2倍,大于8G时与内存等大
- /home分区:剩余所有空间(便于重装系统时保留用户数据)
安装完成后首先执行:
bash复制sudo apt update && sudo apt upgrade -y
sudo apt install -y build-essential git curl
注意:build-essential包含了gcc/g++/make等基础编译工具链,是C/C++开发的必备包
2.2 开发环境核心组件安装
现代C/C++开发需要更完善的工具链:
bash复制# 安装最新版GCC工具链
sudo apt install -y gcc-12 g++-12
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 100
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-12 100
# 调试工具集
sudo apt install -y gdb valgrind cmake ninja-build
# 可选:Clang工具链
sudo apt install -y clang-14 lldb-14
验证安装:
bash复制gcc --version # 应显示gcc-12.x
g++ --version # 应显示g++-12.x
3. C/C++开发环境深度配置
3.1 构建系统配置
现代C/C++项目通常使用CMake作为构建系统。创建示例项目结构:
code复制my_project/
├── CMakeLists.txt
├── include/
│ └── utils.h
└── src/
├── main.cpp
└── utils.cpp
基础CMake配置示例(CMakeLists.txt):
cmake复制cmake_minimum_required(VERSION 3.16)
project(MyProject VERSION 1.0 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_library(utils src/utils.cpp include/utils.h)
target_include_directories(utils PUBLIC include)
add_executable(main src/main.cpp)
target_link_libraries(main PRIVATE utils)
3.2 IDE环境配置
推荐使用VSCode作为开发环境,安装以下关键扩展:
- C/C++ (ms-vscode.cpptools)
- CMake Tools (ms-vscode.cmake-tools)
- Code Runner (formulahendry.code-runner)
配置.vscode/settings.json:
json复制{
"C_Cpp.default.cppStandard": "c++20",
"cmake.configureOnOpen": true,
"editor.formatOnSave": true
}
4. 现代C++开发实践
4.1 C++20特性实践
Ubuntu 22.04默认GCC-12完整支持C++20标准。示例演示概念(Concepts)特性:
cpp复制#include <concepts>
#include <iostream>
template<typename T>
concept Numeric = std::integral<T> || std::floating_point<T>;
template<Numeric T>
T square(T x) {
return x * x;
}
int main() {
std::cout << square(5) << std::endl; // 25
std::cout << square(3.14) << std::endl; // 9.8596
// square("hello"); // 编译错误
}
编译命令:
bash复制g++ -std=c++20 -o concepts concepts.cpp
4.2 多线程与异步编程
展示C++11以来的多线程特性:
cpp复制#include <iostream>
#include <thread>
#include <future>
#include <vector>
void worker(int id) {
std::cout << "Worker " << id << " started\n";
std::this_thread::sleep_for(std::chrono::seconds(1));
std::cout << "Worker " << id << " finished\n";
}
int main() {
std::vector<std::future<void>> futures;
for (int i = 0; i < 5; ++i) {
futures.emplace_back(std::async(std::launch::async, worker, i));
}
for (auto& f : futures) {
f.wait();
}
std::cout << "All workers completed\n";
}
编译时需要链接pthread库:
bash复制g++ -std=c++20 -pthread -o threads threads.cpp
5. 调试与性能优化
5.1 GDB高级调试技巧
使用GDB调试多线程程序:
bash复制gdb -q ./my_program
(gdb) break main
(gdb) run
(gdb) info threads # 查看所有线程
(gdb) thread 2 # 切换到线程2
(gdb) bt # 查看该线程调用栈
5.2 Valgrind内存检查
检测内存泄漏和越界访问:
bash复制valgrind --leak-check=full --show-leak-kinds=all ./my_program
典型输出解读:
code复制==12345== 40 bytes in 1 blocks are definitely lost in loss record 1 of 2
==12345== at 0x483BE63: operator new(unsigned long) (vg_replace_malloc.c:417)
==12345== by 0x1091FE: main (main.cpp:15)
6. 项目实战:构建高性能网络服务器
6.1 基于epoll的IO多路复用
展示Linux高性能网络编程核心模式:
cpp复制#include <sys/epoll.h>
#include <unistd.h>
#include <fcntl.h>
const int MAX_EVENTS = 64;
int setup_nonblocking_socket() {
int sockfd = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0);
// ... 绑定和监听设置
return sockfd;
}
void event_loop(int epoll_fd) {
struct epoll_event events[MAX_EVENTS];
while (true) {
int n = epoll_wait(epoll_fd, events, MAX_EVENTS, -1);
for (int i = 0; i < n; i++) {
if (events[i].events & EPOLLIN) {
// 处理可读事件
}
if (events[i].events & EPOLLOUT) {
//
