C/C++八股文知识积累5—项目从构建到运行的流程

目录

项目架构和配置

build文件夹

CMakeLists.txt文件夹

构建自动化

预处理

编译

汇编

链接


项目架构和配置

不同的项目架构不同,一般都会有不同命名的文件夹表示项目中不同代码的含义。这里可以着重注意两个文件,一个是build文件夹,一个是CMakeLists.txt文件夹。

build文件夹

存放构建过程中的临时文件(.o目标文件等)和最终产物(即可执行文件),一般将整个项目编译连接之后产生的文件(中间文件和最终产物)存放于此。它主要作用是和源码分离,保持源码干净

CMakeLists.txt文件夹

这个文件涉及元构建系统/构建系统生成器 CMake。CMake并不直接编译代码,它读取CMakeLists.txt,检测环境(编译器版本、库路径),然后生成适合平台的构建文件(Linux下生成Makefile、Windows下生成Visual Sudio Solution,或者生成Ninja文件),包括定义项目名、定义生成文件类型和定义依赖关系。

构建自动化

根据构建文件(Makefile)(由cmake文件自动生成或者项目本身就有),Make或者Ninja自动构建整个项目。具体包括如下几个阶段:

预处理

处理所有以#开头的指令,包括将宏定义(#define)进行替换,处理条件编译(#ifdef,#endif),最重要的是将#include "header.h"的内容直接复制粘贴到.cpp文件中。

编译

运用编译器g++或者gcc等,将预处理后的C++代码翻译成汇编语言。可以加入指令,这时编译器核心部分,分析代码逻辑,进行循环展开,死代码消除、指令重拍等操作。最终产出.s汇编文件。

汇编

运用汇编器,将汇编语言翻译成机器能读懂的机器码,产出.o目标文件。此时.o文件中虽然包含机器码,但里面函数调用还是悬空。即.o文件内部不仅仅有机器码,还包含两张至关重要的表,符号表和重定位表。在实际汇编中,当汇编器遇到非本文件的函数调用时,由于其并不知道具体地址,所以他将此地址留空,并在重定位表中写下记录告知链接器在代码段什么地址处,需要用到什么函数的真实地址,待链接器填写。并维护以下两个表。

  1. 符号表。当前.o文件的“资产负债表”,即记录有什么函数,缺少什么函数。例如如下:
    0000000000000000 T main             <-- T 表示 Text,我定义了 main 函数 (资产)
                     U add              <-- U 表示 Undefined,我用到了 add,但我不知道它在哪 (负债)
                     U printf           <-- U 表示 Undefined,我用到了 printf (负债)
  2. 重定位表。这是.o文件的补全指南,告诉链接器在什么地址用到了哪个函数,但本文件没有需要链接器填写。如下所示:
    RELOCATION RECORDS FOR [.text]:
    OFFSET           TYPE              VALUE
    000000000000001a R_X86_64_PLT32    add-0x0000000000000004
    0000000000000025 R_X86_64_PLT32    printf-0x0000000000000004

链接

将无数个.o目标文件和库文件组合成最终产品的过程。分为静态链接和动态链接:

  1. 静态链接.库文件.a(Linux)和.lib(Windows)。静态库本质就是一堆.o文件的压缩包,链接器会将代码中用到的函数或者部分直接拷贝到可执行文件中,这样函数地址在链接期就直接确定。优点是部署方便,不依赖外部环境。缺点是生成文件太大,如果库更新了,需要重新编译整个项目。
  2. 动态链接.库文件.so(Linux)和.dll(Windows)和.dylib(macOS)。链接器不拷贝代码,只在可执行文件中记录在哪个库文件中用到哪个函数,当程序启动时,操作系统会加载这些库文件,自动寻找所需部分填入可执行文件中,这样函数地址在运行或第一次调用时才确定。优点是节省磁盘和内存,库更新只需替换文件,无需重编程序。
  3. 符号解析.链接器扫描所有输入文件,建立全局符号表,确保每个函数还有一个定义、每个被调用函数都能找到定义。(全局符号表并不是一个单独的物理文件,而是在内存中的一种复杂数据结构)

常见术语

  1. GCC是什么?GCC是GUN编译器套件,是一个编译器系统,不是单个程序,包含一系列编译工具的集合,包含gcc、g++等编译器(这些都是广义上的汇编,即包含预处理、编译、汇编、链接全流程)。
  2. ...
当前,全球经济格局深刻调整,数字化浪潮席卷各行各业,智能物流作为现代物流发展的必然趋势和关键支撑,正迎来前所未有的发展机遇。以人工智能、物联网、大数据、云计算、区块链等前沿信息技术的快速迭代与深度融合为驱动,智能物流不再是传统物流的简单技术叠加,而是正在经历一场从自动化向智能化、从被动响应向主动预测、从信息孤岛向全面互联的深刻变革。展望2025年,智能物流系统将不再局限于提升效率、降低成本的基本目标,而是要构建一个感知更全面、决策更精准、执行更高效、协同更顺畅的智慧运行体系。这要求我们必须超越传统思维定式,以系统化、前瞻性的视角,全面规划和实施智能物流系统的建设。本实施方案正是基于对行业发展趋势的深刻洞察和对未来需求的精准把握而制定。我们的核心目标在于:通过构建一个集成了先进感知技术、大数据分析引擎、智能决策算法和高效协同平台的综合智能物流系统,实现物流全链路的可视化、透明化和智能化管理。这不仅是技术层面的革新,更是管理模式和服务能力的全面提升。本方案旨在明确系统建设的战略方向、关键任务、技术路径和实施步骤,确保通过系统化部署,有效应对日益复杂的供应链环境,提升整体物流韧性,优化资源配置效率,降低运营成本,并最终为客户创造更卓越的价值体验。我们致力于通过本方案的实施,引领智能物流迈向更高水平,为构建现代化经济体系、推动高质量发展提供强有力的物流保障。
电源题电赛单相并网离网软件硬件锁相环单极性双极性调制等代码及仿真环路计算资料+原理图PCB内容概要:本文档是一份关于电力电子与能源系统仿真研究的技术资料集合,涵盖单相并网/离网系统、软件与硬件锁相环设计、单极性与双极性调制技术、虚拟同步机控制建模、P2G-CCS耦合系统、微电网优化调度、光伏风电联合运行、储能配置及需求响应等多个电力系统核心主题。文档提供了大量基于Matlab/Simulink的代码实现与仿真模型,包括LLC谐振变换器小信号分析、永磁同步电机控制、DC-AC变换器设计、光伏阵列故障仿真、直流微电网建模等,并附有原理图与PCB设计资源。同时整合了智能优化算法(如遗传算法、粒子群、灰狼优化器)、机器学习模型(如LSTM、CNN-GRU-Attention)在负荷预测、故障诊断、路径规划等领域的应用案例,形成一个跨学科的科研资源包。; 适合人群:电气工程、自动化、能源系统及相关专业的研究生、科研人员以及从事电力电子、微电网、新能源控制方向的工程师;具备Matlab/Simulink编程基础和一定电力系统理论知识者更佳。; 使用场景及目标:① 支持电赛或科研项目中对并网逆变器、锁相环、调制策略的设计与验证;② 用于复现高水平论文(如EI/SCI)中的优化调度、控制算法与仿真模型;③ 辅助开展微电网能量管理、储能配置、需求响应策略等课题的研究与代码开发;④ 提供可直接调用的算法模板与仿真平台,提升科研效率。; 阅读建议:建议按照文档结构逐步浏览,优先下载并整理网盘中的完整资源包,结合具体研究方向选取对应代码与模型进行调试与二次开发;对于复杂算法(如NSGA-II、ADMM、MPC),应配合文献理解其数学原理后再实施仿真;关注其中“论文复现”类内容以提升学术研究规范性与技术深度。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值