小柴带你学AutoSar系列一、基础知识篇(4)编译

小柴带你学AutoSar总目录icon-default.png?t=N7T8https://blog.csdn.net/qianshang52013/article/details/138140235?spm=1001.2014.3001.5501

Flechazoicon-default.png?t=N7T8https://www.zhihu.com/people/jiu_sheng

编译真的很重要!了解一下机器是如何工作的吧。当然啦!通过学习这篇文章还可以学习制作库文件哦!隐藏你的源码,依然可以调用函数。这样代码发给别人就不怕源码暴漏哦!🍔

实际项目中确实也会接触到这块,所以想拿出来入门一下。

目录

GCC编译

1. 预处理阶段(Preprocessing)

2. 编译阶段(Compilation)

3. 汇编阶段(Assembly)

4. 链接阶段(Linking)

示例

GHS编译

1. 源代码准备

2. 预处理阶段

3. 编译阶段

4. 汇编阶段

5. 链接阶段

总结

静态库.lib

1.制作静态库

2.使用静态库

1. 创建或打开你的C项目

2. 将静态库文件添加到项目

3. 添加库文件路径和库文件名到项目设置


GCC编译

GCC 编译器是一个开源的编译器套件,用于编译多种编程语言,包括 C、C++、Objective-C、Fortran、Ada 等。它是一个功能强大且灵活的编译器,支持多种平台和架构。

1. 预处理阶段(Preprocessing)

在预处理阶段,GCC 将源代码中的预处理指令(以 # 开头的指令,如 #include#define)处理成纯 C 代码。预处理器会将头文件包含到源文件中,执行宏替换等操作。

生成的文件:通常,预处理后的文件会以 .i 扩展名保存,如 source.i

2. 编译阶段(Compilation)

编译阶段将预处理后的源文件翻译成汇编语言。GCC 使用的是内置的 C 编译器(称为 cc1),它将 C 代码转换成目标机器的汇编代码。

生成的文件:通常,编译后的文件会以 .s 扩展名保存,如 source.s

3. 汇编阶段(Assembly)

在汇编阶段,汇编器将汇编代码转换成机器码指令,生成目标文件。这些目标文件包含了二进制代码和相关的元数据。

生成的文件:通常,汇编后的文件会以 .o 扩展名保存,如 source.o

4. 链接阶段(Linking)

链接阶段将所有的目标文件(包括程序的主文件和所有的库文件)链接在一起,生成最终的可执行文件。链接器(ld)负责解析符号引用、符号重定位等任务,将各个目标文件中的代码和数据段组合成一个可执行文件。

生成的文件:最终生成的可执行文件通常没有扩展名,如 a.out

示例

假设有一个 C 源文件 hello.c

#include <stdio.h>int main() {printf("Hello, world!\n");return 0;
}

通过 GCC 编译该文件时,可以执行以下命令:

gcc -o hello hello.c

这个命令会依次执行预处理、编译、汇编和链接四个阶段,并生成最终的可执行文件 hello

  • hello.i:预处理后的文件。

  • hello.s:编译后的汇编文件。

  • hello.o:汇编后的目标文件。

  • hello:最终的可执行文件。

这就是 GCC 编译器的工作过程以及每个阶段生成的文件。

GHS编译

RH850 是一种用于嵌入式系统的微控制器(MCU),通常用 Green Hills Software(GHS)编译工具进行编译和链接。GHS 工具链包含编译器、汇编器、链接器等,支持各种目标平台和架构。编译过程包括使用链接脚本,这是生成嵌入式系统二进制文件的关键步骤。下面是一个典型的 RH850 使用 GHS 编译器的编译过程,详细介绍了每个阶段及其生成的文件,特别是链接器脚本的作用。

1. 源代码准备

假设有一个简单的 C 源文件 main.c

#include <stdio.h>void main(void) {printf("Hello, RH850!\n");
}

2. 预处理阶段

预处理器将处理所有的预处理指令,例如 #include#define,生成一个预处理后的文件。

命令

ccrh850 -E main.c -o main.i

生成的文件

  • main.i:预处理后的文件。

3. 编译阶段

编译器将预处理后的 C 代码转换为汇编代码。

命令

ccrh850 -S main.i -o main.s

生成的文件

  • main.s:汇编代码文件。

4. 汇编阶段

汇编器将汇编代码转换为机器代码,生成目标文件。

命令

asrh850 main.s -o main.o

生成的文件

  • main.o:目标文件(对象文件)。

5. 链接阶段

链接器将多个目标文件和库文件链接在一起,生成可执行文件。链接器脚本在这个阶段非常重要,用于指定代码和数据段在内存中的布局。

链接器脚本(linker script)

一个典型的链接器脚本可能如下所示(linker.ld):

SECTIONS
{.text : {*(.text)}.data : {*(.data)}.bss : {*(.bss)}
}

这个脚本指定了 .text 段(代码段)、.data 段(数据段)和 .bss 段(未初始化数据段)的布局。

命令

librh850 main.o -T linker.ld -o main.elf

生成的文件

  • main.elf:最终的可执行文件(ELF 格式)。

总结

  • 预处理:

    ccrh850 -E main.c -o main.i
    • 生成预处理后的文件 main.i

  • 编译:

    ccrh850 -S main.i -o main.s
    • 生成汇编代码文件 main.s

  • 汇编:

    asrh850 main.s -o main.o
    • 生成目标文件 main.o

  • 链接:

    librh850 main.o -T linker.ld -o main.elf
    • 生成最终的可执行文件 main.elf,使用链接器脚本 linker.ld 指定内存布局。

每个阶段都生成特定的中间文件和最终的可执行文件,链接器脚本在链接阶段至关重要,它定义了程序的内存布局,使得生成的二进制文件能够正确地运行在目标硬件上。

静态库.lib

通过静态库,开发者可以隐藏实现细节,仅暴露接口(头文件)。这增加了代码的安全性,并使得接口的更改不会影响到使用该库的代码,只要接口保持不变。

真的太好玩啦!

1.制作静态库

  • VS创建一个新项目

  • 打印一些信息,并在头文件声明这个函数

  • 生成lib

看到他啦

2.使用静态库

1. 创建或打开你的C项目

首先,确保你已经在Visual Studio中创建了一个C项目或打开了现有的C项目。

2. 将静态库文件添加到项目

假设你的静态库文件是 StaticLib1.lib

  1. StaticLib1.lib 文件拷贝到你的项目目录中,通常放在一个特定的文件夹中,比如 libs 文件夹。我懒哈哈!随便放啦

3. 添加库文件路径和库文件名到项目设置

  1. 打开项目属性

    • 在解决方案资源管理器中,右键点击你的项目名称,选择“属性”(Properties)。

  2. 配置包含目录

    • 在项目属性窗口中,导航到 Configuration Properties -> C/C++ -> General

    • Additional Include Directories 字段中,添加你的头文件目录的路径。如果你的头文件在 include 文件夹中,输入相对路径 include 或者绝对路径。

  3. 配置库目录

    • 在项目属性窗口中,导航到 Configuration Properties -> Linker -> General

    • Additional Library Directories 字段中,添加你的静态库目录的路径。如果你的库文件在 libs 文件夹中,输入相对路径 libs 或者绝对路径。

  4. 添加库文件

    • 在项目属性窗口中,导航到 Configuration Properties -> Linker -> Input

    • Additional Dependencies 字段中,添加你的库文件名称 mylibrary.lib。如果有多个库文件,用分号分隔。

最后就可以调用静态库里的函数啦!同时又看不到函数的具体实现。是不是贼有意思呢?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/20397.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

unityBIM

Revit模型到Unity勉强能用 1、Revit直接导出FBX&#xff0c;然后拖到unity里面 2、通过Navisworks导出FBX&#xff0c;拖到unity里面。 我什么都还没做&#xff0c;只建立了一个空的URP效果&#xff0c;把FBX拖进去&#xff0c;挂了一个相机控制器&#xff0c;效果勉强看得过…

中医的悠久历史文化

中医&#xff0c;作为中华民族的传统医学&#xff0c;拥有着悠久的历史和深厚的文化底蕴。自古以来&#xff0c;中医便以其独特的理论体系和治疗方法&#xff0c;为中华民族的繁衍昌盛做出了巨大贡献。如今&#xff0c;随着现代医学的不断发展&#xff0c;中医依然以其独特的魅…

【计算机毕设】SpringBoot海滨体育馆管理系统设计与实现 - 源码免费(私信领取)

免费领取源码 &#xff5c; 项目完整可运行 &#xff5c; v&#xff1a;chengn7890 诚招源码校园代理&#xff01; 1. 引言 体育馆作为重要的体育场馆&#xff0c;承担着举办体育赛事、健身活动和文化演出等多种功能。为了提高体育馆的管理效率和服务质量&#xff0c;本项目旨在…

DASK==python并行计算

文档10 Minutes to Dask — Dask documentation demo代码 import numpy as np import pandas as pd import dask.dataframe as dd import dask# 设置调度器为多线程 dask.config.set(schedulerthreads) # 创建一个示例的Pandas DataFrame index pd.date_range("2021-09…

Java后端代码框架包设计-什么是Domain,BO,VO?我们改如何区分和定义?

我们先来看看一个项目的代码结构,如下图: 1.定义包名用domain这个单词是什么含义 在Java中,domain 这个单词通常用于表示应用程序的“领域模型”(Domain Model)或“领域层”(Domain Layer)。领域模型是描述系统业务逻辑和规则的对象集合,它通常包含实体(Entities)、…

主机加固解决方案分享

在信息化社会的今天&#xff0c;网络安全问题日益凸显&#xff0c;其中主机的安全性更是至关重要。主机加固&#xff0c;作为提升计算机系统安全性的重要手段&#xff0c;其重要性不言而喻。那么&#xff0c;有什么好的方案呢&#xff1f;今天我就给大家介绍个主机加固的解决方…

Git使用规范及命令

文章目录 一、Git工作流二、分支管理三、Git命令操作规范1. 切到develop分支&#xff0c;更新develop最新代码2. 新建feature分支&#xff0c;开发新功能3. 完成feature分支&#xff0c;合并到develop分支4. 当某个版本所有的 feature 分支均合并到 develop 分支&#xff0c;就…

领域建模(系统操作复习)

习题 问题 考察点 领域建模 识别概念类 固定模板 Conceptual Class Category Examples specifications,designs, or descriptions of things roles of people containers of other things things in a container abstract noun concepts organizations events processes (…

vs2022 MSVC2017_64 调试Qt5.14.2源码

pdb调试文件下载路径https://download.qt.io/online/qtsdkrepository/windows_x86/desktop/qt5_5142/qt.qt5.5142.debug_info.win64_msvc2017_64/ 在vs中添加pdb文件符号路径&#xff0c;使其qt在调试时能查找到相应的符号文件。 在需要调试的解决方案下通过解决方案点击&…

【Linux】日志管理

一、日志进程 1、处理日志的进程 rsyslogd&#xff1a;系统专职日志程序 观察rsyslogd程序&#xff1a; ps aux | grep rsyslogd 2、常见的日志文件 1、系统主日志文件: /var/log/messages 动态查看日志文件尾部&#xff1a; tail -f /var/log/messages 2、安全…

C语言-01_HelloWord

文章目录 1.C程序运行机制2.HelloWorld的剖析① main()② 函数体③ printf()④ 标准库、头文件 3.输出3.1 printf()标准格式3.2 占位符3.3 输出格式 1.C程序运行机制 过程1&#xff1a;编辑 编写C语言源程序代码&#xff0c;并已文件的形式存储到磁盘中。源程序文件以“.c”作…

k8s自定义资源你会创建吗

创建自定义资源定义 CustomResourceDefinition 当你创建新的 CustomResourceDefinition&#xff08;CRD&#xff09;时&#xff0c;Kubernetes API 服务器会为你所 指定的每一个版本生成一个 RESTful 的 资源路径。CRD 可以是名字空间作用域的&#xff0c;也可以是集群作用域的…

VHDL/CPLD硬件描述语言:2022年做的万年历实验

之前接触过一些硬件描述语言以及VHDL/CPLD的单片机的设计实验&#xff0c;那时是2022年了 这里补写一篇笔记,以记录一下那十多个小时 万年历实验 研究中的心得体会&#xff1a; 说明解释都是个人理解&#xff0c;与标准描述有较大出入...... 目录 输入输出器件的编写: 分频器…

【Keil 5】Keil 5下载安装激活到2032年(含MDK、C51、STM32单片机)+附带百度网盘链接

这里写目录标题 安装包、激活文件下载1.双击mdk 514开始安装2.一路点next&#xff0c;信息随便写即可3.激活4.安装STM325.激活c51 安装包、激活文件下载 解压密码&#xff1a;lantongxue 链接&#xff1a;https://pan.baidu.com/s/15Aukt0j1HCFyHBE6whuDeg?pwdsjyh 提取码&…

Streamsets-JDBC模式使用更新时间字段数据同步

StreamSets的开源地址&#xff1a;https://github.com/streamsets/datacollector-oss Streamsets官网地址&#xff1a;https://streamsets.com/ Streamsets文档地址&#xff1a;https://docs.streamsets.com/portal/datacollector/3.16.x/help/index.html 我又来写Streamsets了…

LangChain实战技巧之四:当模型(Model)不支持Tool/Function的解决办法

文心大模型两大主力模型已全面免费&#xff0c;可参考我之前发的文章 AI菜鸟向前飞 — 今日三则AI相关新闻 但是&#xff0c;这些模型原生并不支持Tool/Function Call 如下所示&#xff1a; tool def greeting(name: str):向朋友致欢迎语return f"你好啊, {name}"…

基于LabVIEW虚拟示波器设计

随着计算机技术的发展&#xff0c;传统仪器开始向计算机化的方向发展。虚拟仪器是90年代提出的新概念。虚拟仪器技术的提出与发展&#xff0c;标志着二十一世纪自动测试与电子测量仪器领域技术发展的一个重要方向。所谓虚拟仪器&#xff0c;就是在通用的计算机平台上定义和设计…

TDR原理的介绍

目录 简介 简单定义 TDR测试原理 简介 时域和频域就像孪生兄弟一样&#xff0c;经常在测试测量领域同时出现&#xff0c;可谓是工程师们分析问题和解决问题的两大法宝。所以&#xff0c;在某些测试场景中&#xff0c;如果有时域信息的护法&#xff0c;咱们就能从时频域两个维…

【普通切换】【DC-based handover】【DAPS】协议栈分析

移动网络切换 移动通信中切换是保证终端业务的基本流程&#xff0c;而切换时延是终端(UE)不能与任何基站交互(传递)用户面数据包的最短时间。 在5G(NR)网络中当终端(UE)接收到切换命令时&#xff0c;将断开与源小区的连接向目标小区发起随机接入过程。在此期间终端(UE)的数据传…

牛客ONT45 距离是K的二叉树节点【中等 宽度优先遍历 Java/Go/PHP/C++】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/e280b9b5aabd42c9b36831e522485622 思路 图&#xff0c;队列 构件图&#xff0c;直接从target出发&#xff0c;扩展到第k层就是答案Java代码 import java.util.*;/** public class TreeNode {* int val 0;* …