C/C++ 内存布局、程序构建与静态库动态库

从内存区域划分(.text / .rodata / .data / .bss / 栈 / 堆)讲到构建四阶段(预处理 → 编译 → 汇编 → 链接),再到静态库与动态库的创建、链接行为差异,末尾汇总易错点。 一、内存布局在构建阶段就确定 Determined at Build Time:.text / .rodata / .data / .bss 的内存布局、大小在编译链接构建阶段就确定,不是程序跑起来才决定。这几段都属于 static lifetime 静态生命周期,由编译器自动管理分配与释放,程序员不能手动干预申请释放。 按数据类型、生命周期和作用域,C/C++ 程序的内存通常划分为五大区域:代码区、全局/静态存储区、栈区、堆区、常量区。其中代码区对应 .text,常量区对应 .rodata,全局/静态存储区对应 .data 与 .bss,栈区与堆区则在运行时分配。 1. .text 代码段(文本段 / 代码区) 存储内容:编译之后的机器指令(machine code),即写出的函数、if/for 循环、main 函数等翻译成 CPU 能执行的指令。所有的函数定义、控制结构都会被转换成机器指令存放在这里。 大小:Fixed size,构建阶段确定大小。 权限:Read-only 只读,防止运行时篡改程序指令。这部分内存是共享的,在程序执行期间不会改变。 生命周期:静态生命周期,进程整个运行期间都存在,进程退出由操作系统回收。 管理:完全由编译器、链接器自动管理,程序员没有 API 手动分配释放本段内存。 编译时,main、func 等函数的代码被转换成机器指令存放在可执行文件的代码段中(此时还在磁盘上的可执行文件里);程序运行时,操作系统把这些指令加载到内存的代码段,CPU 再从内存的代码段中读取并执行。 2. .rodata 只读数据段(常量区) 存储内容:初始化后的常量,比如字符串字面量 "hello world"、const char *p = "abc" 这类常量字符串,以及全局 const 常量。 权限:只读 Read-only,程序运行不能修改,写操作会触发段错误。这部分内存同样通常在程序执行期间不会改变。 区分:const int a = 10; 声明在全局放 rodata;局部 const 变量本质还是在栈上。 ...

2026 年 10 月 13 日

CMake 工程模板:VS2022 + Boost(静态库)

这是一个可直接复制的 Boost 工程模板(VS2022 + CMake + Ninja)。模板的作用:新建 Boost 项目时不用每次从零配置——复制模板、改项目名、加源文件即可。整套约定是:CMake 为唯一构建系统、依赖走环境变量 + find_package、构建输出在 out/build/、不写死路径。 前置环境变量: BOOST_ROOT = <Boost根目录> Boost 是静态库(vc143 构建),不用加 PATH,运行时不需要 dll 一、目录结构 <项目根目录>\BoostTemplate\ ├── CMakeLists.txt ├── CMakePresets.json ├── .gitignore ├── src\ │ └── main.cpp └── out\ └── build\ 二、CMakeLists.txt(复制到项目根目录) cmake_minimum_required(VERSION 3.20) project(BoostTemplate LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # ---------- Boost ---------- # BOOST_ROOT 由 CMakePresets.json 从环境变量注入,这里不写路径 set(Boost_NO_SYSTEM_PATHS ON) # 只从 BOOST_ROOT 找,不扫系统路径 set(Boost_USE_STATIC_LIBS ON) # 用静态库(vc143 静态构建) set(Boost_USE_MULTITHREADED ON) # 多线程版本 find_package(Boost 1.81 REQUIRED COMPONENTS filesystem system thread) # ---------- 源文件 ---------- set(SOURCES src/main.cpp ) add_executable(${PROJECT_NAME} ${SOURCES}) target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src ) target_link_libraries(${PROJECT_NAME} PRIVATE Boost::filesystem Boost::system Boost::thread ) 三、CMakePresets.json(复制到项目根目录) { "version": 3, "configurePresets": [ { "name": "debug", "generator": "Ninja", "binaryDir": "${sourceDir}/out/build/${presetName}", "cacheVariables": { "CMAKE_BUILD_TYPE": "Debug", "BOOST_ROOT": "$env{BOOST_ROOT}", "Boost_NO_SYSTEM_PATHS": "ON", "Boost_USE_STATIC_LIBS": "ON", "Boost_USE_MULTITHREADED": "ON" } }, { "name": "release", "inherits": "debug", "cacheVariables": { "CMAKE_BUILD_TYPE": "Release" } } ], "buildPresets": [ { "name": "debug", "configurePreset": "debug" }, { "name": "release", "configurePreset": "release" } ] } 版本待核实:预设文件 "version": 3 与 CMakeLists.txt 里 cmake_minimum_required(VERSION 3.20) 的版本要求是否匹配(version 3 预设需较新的 CMake),首次配置前请确认本机 / VS2022 自带 CMake 的实际版本。 ...

2026 年 10 月 13 日