当前位置: 首页 > article >正文

C++数据结构1——可执行文件生成过程

C源代码生成最终可执行文件的过程通常分为四个核心步骤预处理(Preprocessing)、编译(Compilation)、汇编(Assembly)和链接(Linking)。我们可以通过一个经典的HelloWorld程序来完整演示这个过程// hello.cpp #include iostream #define GREETING Hello, World! int main() { std::cout GREETING std::endl; return 0; }在 Linux 系统中使用g编译器整个流程可以通过一条命令完成g hello.cpp -o hello▲g编译器根本任务是将人类可读的 C 源代码.cpp文件转换成计算机可以执行的机器码最终生成可执行文件。但实际上这条命令背后隐藏了以下四个独立的步骤。1. 预处理 (Preprocessing)输入源代码文件 (.cpp)。工具预处理器 (cpp)。主要任务处理所有以#开头的预处理指令。头文件包含 (#include)将iostream等头文件的内容完整地复制到当前文件中。宏展开 (#define)将代码中的GREETING替换为Hello, World!。条件编译 (#ifdef,#ifndef)处理条件编译指令。输出一个纯粹的、可读的翻译单元通常以.i或.ii为扩展名。这个文件里已经没有了任何宏定义或#include指令。实际操作g -E hello.cpp -o hello.i查看hello.i文件你会发现它的末尾部分变成了这样// 前面是 iostream 展开的上千行代码 ... int main() { std::cout Hello, World! std::endl; return 0; }可以看到#include iostream被替换成了上千行代码而GREETING被直接替换成了字符串字面量。2. 编译 (Compilation)输入预处理后的文件 (.i或.ii)。工具编译器核心 (cc1plus)。主要任务这是最核心、最复杂的一步。它将高级语言代码翻译成汇编语言。词法分析、语法分析、语义分析检查代码是否符合语言规范。优化进行各种优化如删除无用代码、内联函数等。生成汇编代码产生针对目标CPU架构如x86-64, ARM的汇编指令。输出一个汇编语言文件通常以.s为扩展名。实际操作g -S hello.i -o hello.s3. 汇编 (Assembly)输入汇编语言文件 (.s)。工具汇编器 (as)。主要任务将人类可读的汇编指令翻译成机器可执行的机器码。输出一个目标文件 (Object File)通常以.o(Linux/macOS) 或.obj(Windows) 为扩展名。这个文件里包含了二进制机器码但它还不是一个可执行程序因为其中的地址和外部符号如std::cout尚未被解析。实际操作g -c hello.s -o hello.o # 或者直接从源代码生成 .o 文件 # g -c hello.cpp -o hello.o可以使用nm命令查看目标文件中的符号nm hello.o输出中会有一个U _ZSt4cout这代表std::cout是一个未定义 (Undefined)的外部符号它将在链接步骤中被解析。4. 链接 (Linking)输入一个或多个目标文件(.o/.obj) 和库文件(.a/.lib/.so/.dll)。工具链接器 (ld或lld)。主要任务将所有的目标文件和库文件“组装”在一起解决它们之间的符号引用问题。符号解析将hello.o中对std::cout的引用与 C 标准库中std::cout的实际定义地址关联起来。重定位为代码和数据分配最终的内存地址修正所有指令中的地址。合并段将所有输入文件的代码段 (.text)、数据段 (.data) 等合并到输出文件中。输出最终的可执行文件 (Linux/macOS 下无扩展名Windows下为.exe) 或共享库文件 (.so/.dll)。实际操作g hello.o -o hello———————————————————————————————————————————· 另一种思路——CMakeCMake是跨平台的构建系统生成器不直接编译代码与g不同而是用一种更高级、更抽象的配置文件CMakeLists.txt来描述项目然后自动为你生成对应平台的原生构建文件比如 Linux 下的 Makefile 或 Windows 下的 Visual Studio 项目文件。示例# CMakeLists.txt cmake_minimum_required(VERSION 3.10) # 1. 编译器设置 set(CMAKE_CUDA_COMPILER /usr/local/cuda/bin/nvcc) project(RadarISAC LANGUAGES CXX CUDA) set(CMAKE_CXX_STANDARD 14) set(CMAKE_CUDA_STANDARD 14) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_AUTOUIC ON) # 2. 查找库 find_package(Qt5 COMPONENTS Core Gui Widgets PrintSupport REQUIRED) find_package(CUDA REQUIRED) include_directories( ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/processing ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty /usr/local/cuda/include ) # 模块 A: CUDA 核心静态库 (公用部分) set(CUDA_SOURCES processing/cuda_algo.cu processing/cuda_algo.h ) add_library(RadarCudaLib STATIC ${CUDA_SOURCES}) set_property(TARGET RadarCudaLib PROPERTY CUDA_ARCHITECTURES 87) target_link_libraries(RadarCudaLib PRIVATE ${CUDA_CUFFT_LIBRARIES}) set_property(TARGET RadarCudaLib PROPERTY POSITION_INDEPENDENT_CODE ON) # 模块 B: 原始 GUI 程序 (自己调试) set(GUI_SOURCES main.cpp mainwindow.cpp mainwindow.h processing/radar_processor.cpp processing/radar_processor.h 3rdparty/qcustomplot.cpp 3rdparty/qcustomplot.h ) add_executable(RadarGUI ${GUI_SOURCES}) target_link_libraries(RadarGUI PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets Qt5::PrintSupport RadarCudaLib ${CUDA_LIBRARIES} ) # 模块 C: 共享库 .so (Python 调用) set(LIB_SOURCES radar_interface.cpp processing/radar_processor.cpp processing/radar_processor.h ) # 生成动态库 (SHARED) add_library(RadarLib SHARED ${LIB_SOURCES}) # 设置输出名字为 RadarISAC - 最终生成 libRadarISAC.so set_target_properties(RadarLib PROPERTIES OUTPUT_NAME RadarISAC) # 链接依赖 (注意这里链接了开启 PIC 的 RadarCudaLib) target_link_libraries(RadarLib PRIVATE RadarCudaLib ${CUDA_LIBRARIES} cufft )

相关文章:

C++数据结构1——可执行文件生成过程

C源代码生成最终可执行文件的过程&#xff0c;通常分为四个核心步骤&#xff1a;预处理(Preprocessing)、编译(Compilation)、汇编(Assembly) 和 链接(Linking)。我们可以通过一个经典的 HelloWorld 程序来完整演示这个过程&#xff1a;// hello.cpp #include <iostream>…...

Java高并发YOLO服务:100路摄像头实时交通标志识别与Redis缓存优化

摘要&#xff1a;在智慧交通系统中&#xff0c;面对成百上千路高清摄像头的实时视频流&#xff0c;传统的“单路单线程”或“Python脚本调用”架构早已不堪重负&#xff0c;导致延迟高企、资源浪费。本文深入探讨如何基于 Java 21 (Virtual Threads) 构建超高并发视频处理流水线…...

COMSOL模拟离子迁移及PH变化:电场、流场与稀物质传递三个物理场的应用

comsol模拟离子迁移PH变化。 应用到电场&#xff0c;流场&#xff0c;稀物质传递三个物理场。实验台上放着微流控芯片样品的时候&#xff0c;突然意识到酸碱度分布对实验结果影响比想象中更大。这时候COMSOL的多物理场耦合功能简直就是救星——把电场、流体、物质迁移三个模块组…...

基于麻雀算法优化门控循环单元的SSA-GRU单维时序预测模型——适用于MATLAB 2020及...

SSA-GRU单维时序预测预测&#xff0c;基于麻雀算法(SSA)优化门控循环单元(SSA-GRU)单维时间序列预测 1、运行环境要求MATLAB版本为2020及其以上&#xff0c;单输入单输出 2、评价指标包括:R2、MAE、MSE、RMSE等&#xff0c;图很多&#xff0c;符合您的需要 3、代码中文注释清晰…...

二维Comsol的Voronoi边界设置与多边形骨料、纤维骨料分析方法

二维comsol的Voronoi&#xff0c;可设置方形边界&#xff0c;圆形边界&#xff0c;椭圆边界等等。 可选择条带过渡界面厚度。 需要ABAQUS2020及以上版本&#xff0c;AUTOCAD2020及以上版本 以上两软件进行辅助生成。 另二维多边形骨料&#xff0c;纤维骨料等均可采用此方法。在…...

零成本养虾指南:OpenClaw从入门到卸载

一、基础环境 1、安装 nodejs 下载地址&#xff1a;https://nodejs.org/zh-cn/download/archive/v22.22.1演示版本&#xff1a;https://nodejs.org/dist/v22.22.1/node-v22.22.1-win-x64.zip 解压后&#xff0c;将路径(例如C:\myapp\node-v22.22.1-win-x64)添加到环境变量 …...

彻底搞懂STM32定时器:PSC、ARR、CNT详解,附精确延时代码---STM32 HAL库专栏

&#x1f3ac; 渡水无言&#xff1a;个人主页渡水无言 ❄专栏传送门&#xff1a; 《linux专栏》《嵌入式linux驱动开发》《linux系统移植专栏》 ❄专栏传送门&#xff1a; 《freertos专栏》 《STM32 HAL库专栏》《linux裸机开发专栏》 ❄专栏传送门&#xff1a;《产品测评专栏》…...

Windows操作系统核心知识与安全基础全解析

摘要&#xff1a;在数字世界的每一天&#xff0c;我们几乎都在与操作系统打交道&#xff0c;尤其是微软的Windows。它不仅是电脑的“大管家”&#xff0c;也是连接我们与硬件的桥梁。本文将带你从零开始&#xff0c;系统性地理解Windows的核心构成、运作方式以及至关重要的安全…...

Delta并联机器人:轨迹规划与工作空间求解的正逆解

Delta并联机器人轨迹规划工作空间求解正逆解今天咱们来聊聊Delta并联机器人的轨迹规划和工作空间求解&#xff0c;顺便撸点代码&#xff0c;看看怎么搞正逆解。先说说Delta机器人&#xff0c;这家伙在工业上用得挺多&#xff0c;尤其是高速抓取和装配的场景。它的结构简单&…...

SAP Joule:嵌入 SAP Fiori Launchpad 的生成式 AI 数字助手

在过去很多年里,企业用户对 数字助手 的期待一直很朴素:能回答问题、能帮我找入口、最好还能少点培训成本。可一旦系统规模进入 SAP S/4HANA、SuccessFactors、Ariba、SAP Build Work Zone 这类跨产品协同的现实世界,传统助手往往就会遇到天花板。它也许能理解一段对话,却未…...

刷题笔记:力扣第73、74题(二维矩阵)

力扣第73题-矩阵置零1.拿到题目后&#xff0c;第一时间想到应该先遍历一遍矩阵&#xff0c;分别使用一个行标记数组和一个列标记数组来标记哪里有0&#xff0c;然后进行置零操作&#xff0c;但题目要求使用原地算法&#xff0c;即不开辟新的数组、直接在原矩阵上进行操作。2.那…...

矩转换矩阵

格子玻尔兹曼方法&#xff08;LBM&#xff09;MRT作用力模型格子玻尔兹曼方法搞流动模拟的老司机都知道&#xff0c;MRT&#xff08;多松弛时间&#xff09;模型可比单松弛时间模型&#xff08;BGK&#xff09;香多了。这玩意儿最大的特点就是数值稳定性强&#xff0c;边界条件…...

SpringAI大语言模型调用优化:性能提升技巧

在前面的内容中&#xff0c;我们了解了SpringAI与大语言模型集成的相关基础信息。而在实际使用SpringAI调用大语言模型时&#xff0c;往往会遇到响应慢、资源消耗大等问题。这就需要我们掌握SpringAI调用大语言模型的性能优化方法&#xff0c;从而提升调用的性能。接下来&#…...

SpringAI集成OpenAI:从配置到调用实战

在当今的人工智能领域&#xff0c;大语言模型展现出了强大的能力。SpringAI作为一个优秀的框架&#xff0c;能够很好地与大语言模型集成&#xff0c;为开发者提供便捷的开发体验。而OpenAI作为大语言模型领域的佼佼者&#xff0c;其模型如GPT系列在自然语言处理等方面有着卓越的…...

用C语言程序解决两个简单问题

1.编写程序从键盘输入华氏温度&#xff0c;将其转化为摄氏温度后输出&#xff0c;要求保留2位小数。2. 从键盘输入一整型分钟数&#xff0c;将其换算成用小时和分钟表示&#xff0c;然后进行输出。...

SpringAI大语言模型应用案例:智能问答系统开发

在当今数字化时代&#xff0c;智能问答系统已经成为了许多企业和应用的核心功能之一。它能够快速、准确地回答用户的问题&#xff0c;提供高效的服务。而SpringAI与大语言模型的结合&#xff0c;为开发智能问答系统提供了强大的工具和方法。在这一小节中&#xff0c;我们将通过…...

ssm+java2026年毕设社区医院综合管理信息系统【源码+论文】

本系统&#xff08;程序源码&#xff09;带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容进度安排&#xff1a;2023年8月23日-2023年9月18日 与指导老师进行沟通&#xff0c;确认选题并提交题目进行审核2023年9月19日-2023年10月…...

MedGemma-X快速入门:无需代码,轻松实现X光片智能解读

MedGemma-X快速入门&#xff1a;无需代码&#xff0c;轻松实现X光片智能解读 1. 为什么选择MedGemma-X&#xff1f; 在医疗影像诊断领域&#xff0c;传统的人工阅片方式面临着效率低下、工作强度大、经验依赖性强等问题。而大多数AI辅助诊断工具又需要复杂的部署流程和技术背…...

Typora+Local AI MusicGen:Markdown文档智能配乐系统

TyporaLocal AI MusicGen&#xff1a;Markdown文档智能配乐系统 1. 项目背景与价值 你有没有遇到过这样的情况&#xff1a;写技术文档时总觉得少了点什么&#xff0c;文字虽然清晰但阅读体验单调乏味&#xff1f;或者深夜写代码文档时&#xff0c;希望有点背景音乐来提升工作…...

Cosmos-Reason1-7B大模型部署:从零开始的完整指南

Cosmos-Reason1-7B大模型部署&#xff1a;从零开始的完整指南 本文面向初学者&#xff0c;手把手教你如何从零开始部署Cosmos-Reason1-7B大模型&#xff0c;无需深厚的技术背景&#xff0c;跟着步骤走就能搞定。 1. 环境准备&#xff1a;打好基础很重要 部署大模型前&#xff…...

Git 版本管理实践:如何管理你的 Flux Sea Studio 提示词与参数库

Git 版本管理实践&#xff1a;如何管理你的 Flux Sea Studio 提示词与参数库 你是不是也遇到过这种情况&#xff1f;在 Flux Sea Studio 里尝试了无数个提示词和参数组合&#xff0c;终于生成了一张满意的作品。几天后想复现或者微调一下&#xff0c;却完全想不起来当时到底用…...

Qwen人脸生成图像进阶技巧:提示词怎么写效果更好?

Qwen人脸生成图像进阶技巧&#xff1a;提示词怎么写效果更好&#xff1f; 1. 理解提示词的核心作用 1.1 提示词如何影响生成效果 提示词是您与Qwen人脸生成模型沟通的唯一桥梁。就像给一位画家下达创作指令一样&#xff0c;您提供的描述越精准&#xff0c;生成的结果就越符合…...

Windows 11 WSL默认存储位置修改全攻略:从新手到高手

Windows 11 WSL默认存储位置修改全攻略&#xff1a;从新手到高手 对于许多开发者而言&#xff0c;Windows Subsystem for Linux&#xff08;WSL&#xff09;已经成为日常开发不可或缺的工具。然而&#xff0c;随着使用时间的增长&#xff0c;C盘空间告急的问题逐渐显现——特别…...

WSL2+Ubuntu18.04远程桌面终极指南:从VNC配置到内网穿透全流程

WSL2Ubuntu18.04远程桌面终极指南&#xff1a;从VNC配置到内网穿透全流程 在开发者和系统管理员的日常工作中&#xff0c;能够随时随地访问开发环境已成为刚需。微软推出的WSL2&#xff08;Windows Subsystem for Linux 2&#xff09;让Linux环境与Windows无缝集成&#xff0c;…...

Altium Designer实战:10分钟搞定光耦原理图符号绘制(附详细步骤图)

Altium Designer光耦符号绘制实战&#xff1a;从零到专业的全流程解析 在电子设计领域&#xff0c;光耦&#xff08;光电耦合器&#xff09;作为信号隔离的关键元件&#xff0c;其原理图符号的规范绘制直接影响设计效率和团队协作。对于使用Altium Designer的工程师而言&#x…...

Youtu-Parsing模型Docker容器化部署与Kubernetes运维指南

Youtu-Parsing模型Docker容器化部署与Kubernetes运维指南 最近在搞一个图像解析的项目&#xff0c;用到了Youtu-Parsing这个模型&#xff0c;效果确实不错。但问题来了&#xff0c;怎么把它从开发环境搬到生产环境&#xff0c;让它能稳定、高效地跑起来&#xff0c;还能扛得住…...

伺服电机控制四台丝杆升降机联动的3种方案对比(附真实案例)

伺服电机控制四台丝杆升降机联动的3种方案对比&#xff08;附真实案例&#xff09; 在工业自动化领域&#xff0c;多轴同步控制一直是精密制造的核心挑战之一。想象一下汽车生产线上的车身焊接工位&#xff0c;或是造船厂里数十吨重的分段组装平台&#xff0c;四台丝杆升降机需…...

2026 政府工作报告全文解读:GDP 增长 4.5%-5%,赤字率首破 4%!

导读&#xff1a;2026 年是"十五五"开局之年&#xff0c;政府工作报告释放了哪些重磅信号&#xff1f;4% 赤字率意味着什么&#xff1f;一文带你读懂&#xff01;&#x1f4ca; 一、2025 年成绩单&#xff1a;很不平凡的一年经济发展主要成就2025 年是很不平凡的一年…...

从原理到实战:一文读懂随机森林的核心机制与行业落地

1. 随机森林的团队智慧&#xff1a;为什么一群树比一棵树更聪明&#xff1f; 想象你正在参加一场百万富翁的电视问答节目&#xff0c;遇到一个特别难的问题。这时候你有两个选择&#xff1a;要么自己猜答案&#xff0c;要么使用"求助观众"功能让现场500人投票。显然&…...

CARLA与Autoware联合仿真的数据桥梁:话题转发与TF树配置实战

1. 为什么需要CARLA与Autoware联合仿真 自动驾驶系统的开发离不开仿真测试。CARLA作为开源的自动驾驶仿真平台&#xff0c;提供了高度逼真的虚拟环境和丰富的传感器模型&#xff1b;而Autoware则是目前最成熟的开源自动驾驶软件栈。将两者结合&#xff0c;可以快速验证算法在实…...