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

2024-06-02 01:44

本文主要是介绍小柴带你学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。如果有多个库文件,用分号分隔。

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

这篇关于小柴带你学AutoSar系列一、基础知识篇(4)编译的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1022691

相关文章

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

linux-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理,打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名 打包文件 把压缩包从服务器下载到本地 把压缩包上传到服务器(zip

计组基础知识

操作系统的特征 并发共享虚拟异步 操作系统的功能 1、资源分配,资源回收硬件资源 CPU、内存、硬盘、I/O设备。2、为应⽤程序提供服务操作系统将硬件资源的操作封装起来,提供相对统⼀的接⼝(系统调⽤)供开发者调⽤。3、管理应⽤程序即控制进程的⽣命周期:进程开始时的环境配置和资源分配、进程结束后的资源回收、进程调度等。4、操作系统内核的功能(1)进程调度能⼒: 管理进程、线

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

maven 编译构建可以执行的jar包

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」👈,「stormsha的知识库」👈持续学习,不断总结,共同进步,为了踏实,做好当下事儿~ 专栏导航 Python系列: Python面试题合集,剑指大厂Git系列: Git操作技巧GO

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0