编写Makefile

现在我们将创建一个程序,该程序能够读取次位码文件并打印其中定义的函数名称,以及它们的基本块数,从而显示LLVM库的易用性

什么是Makefile?

  • C语言中,我们使用visual studio开发软件时候,写程序开始时候都会创建一个project项目文件,然后在文件里面编译 .h 和.c 的文件。
  • 在Linux中,有一个叫make的东西,就相当于C语言的集成开发环境,我们只需要在make里面创建文件,写代码,make会帮我们管理这些文件。
  • 不过我们创建的项目不叫project,而是称为Makefile,打开一个make源程序包,发现很多Makefile的文件,说明里面有很多的项目。
  • 在源程序包里面,也有名为makefile的文件(m是小写),两个命名同时存在,这是合理的,在开发一个项目的时候,工程师一般都会命名为Makefile然后打包交给用户,用户觉得某个Makefile需要改动,用户改动后或者新建后的项目定义为makefile,并且在运行时候,先执行makefile,再执行Makefile文件。

Makefile文件

链接LLVM库需要使用长命令行,如果没有构建系统的帮助,想写出这些命令行是不切实际的

注意:Makefile依赖于制表符来指定定义规则的命令
即应该手动插入制表符(下面有解释)
这个Makefile文件基于(DragonEgg中使用的代码)

在这里插入图片描述
解释一
第一部分定义将用作编译器标志的第一个Makefile变量
第一个变量决定llvm-config程序的位置
llvm-config工具是一个LLVM程序
它可以构建需要与LLVM库连接的外部项目的各种有用信息
Ag:
定义在C++编辑器中使用的标志集时
我们将要求Make启动llvm-config --cxxflags
shell命令行,该命令行将打印用于编译LLVM项目的C++标志集
这样就使得项目源码的编译与LLVM源码兼容。
最后一个变量定义要传递给编译器预处理的标志集
在这里插入图片描述

解释二
第二个片段
定义了Makefile的规则
第一个是默认的,用它构建hello-word可执行文件
第二个是通用规则,将所有c++文件编译生成目标文件
将预处理标志和C++编辑器标志传递给它
用$(QUIET)变量来省略屏幕上出现的完整命令
如果想要一个详细的构建日志,运行GUN Make 时定义VERBOSE
最后一个链接规则所有目标文件(在这里只有一个)来构建与LLVM库链接的项目可执行文件
这部分由链接器完成的,但是一些C++标志也可能会生效。
因此我们将C++和链接器标志都传递给命令行
用“command”的结构来完成此操作,它指示shell“command”的输出替换这部分内容
在Ag中命令是 llvm-config --libs bitreader core support
“–libs 标志向llvm-config请求提供链接到所有LLVM库中的链接器标志列表
请求libLLVMBItReader、libLLVMCore、libLLVMSupport
由llvm-config返回的标志列表是一系列-l链接器参数
Ag:-lLLVMCore-lLLVMSupport
注意
传递给链接器的参数顺序很重要,并且要求你依赖于其他库的参数放在前面
Ag:
由于libLLVMCore使用libLLVMSupport提供的通用功能,因此正确顺序是-lLLVMCore-lLLVMSupport

顺序很重要,因为一个库就是一个目标文件的集合,将在项目与库链接时
链接器只选择到目前为止目标文件来解析见到的未定义的符号
因此,如果它正在处理命令行参数的最后一个库,并且该库恰好使用已经处理的库中的符号
则大多数链接器(包括GUN id)将不会返回去包括有可能确实的目标文件,从而导致构建失败

如何避免这个问题?
强制链接器迭代访问每个库,直到所有必要的目标文件都被解析,则必须在库列表的开始和结束出使用–start–group和–end-group标志,但有可能会减慢速度
在构建完整的依赖关系图时,为了避免因为要弄清楚链接器参数的顺序而头疼
可以简单的使用llvm-config --libs 让它为你这些工作

在这里插入图片描述
解释三
Makefile文件的最后一部分定义了一条清理规则以删除编译器生成的所有文件
使我们从头开始从新启动构建

长命令行

在计算机科学中,长命令行是指包含大量参数和选项的命令行。这些参数和选项用于控制命令的行为。

长命令行通常有以下特点:

  • 包含多个参数和选项
  • 参数和选项之间使用空格或分隔符隔开
  • 命令行的总长度可能超过一行

长命令行的示例:

# 这是一个长命令行示例gcc -o hello hello.c -Wall -Wextra -pedantic -std=c11 -g -O2

在这个示例中,gcc 是命令,-o-Wall-Wextra-pedantic-std=c11-g-O2 是参数和选项。

长命令行有以下缺点:

  • 难以阅读和理解
  • 容易出错
  • 不易于维护

为了解决这些问题,可以使用构建系统来帮助管理长命令行。构建系统可以自动生成命令行,并根据需要进行调整。

以下是一些常见的构建系统:

  • CMake
  • Makefile
  • Autotools
  • Bazel

使用构建系统可以带来以下好处:

  • 提高命令行的可读性和可理解性
  • 减少错误的可能性
  • 提高代码的可维护性

因此,如果需要使用长命令行,建议使用构建系统来帮助管理。

回到您最初的问题:“链接LLVM库需要使用长命令行,如果没有构建系统的帮助,想写出这些命令行是不切实际的。”

这句话的意思是,链接 LLVM 库通常需要使用大量的参数和选项。这些参数和选项用于指定要链接的库、编译器选项等信息。如果没有构建系统的帮助,手动编写这些命令行非常繁琐,而且容易出错。

使用构建系统可以自动生成链接 LLVM 库所需的命令行。这可以大大提高效率,并减少错误的可能性。

以下是一些使用构建系统链接 LLVM 库的示例:

  • CMake
cmake_minimum_required(VERSION 3.10)project(Hello)set(CMAKE_CXX_STANDARD 11)add_executable(hello hello.c)target_link_libraries(hello PRIVATE LLVM)
  • Makefile
all:gcc -o hello hello.c -lLLVMclean:rm -f hello

在这个示例中,-lLLVM 选项用于链接 LLVM 库。

制表符

在 Makefile 中,制表符(Tab)是一种特殊的缩进符,用于指定定义规则的命令。它与空格不同,不能被空格替换。

具体来说,制表符在 Makefile 中有以下作用:

  • 区分命令和目标:Makefile 中的每一行都由目标和命令组成。目标是 Makefile 要生成的文件或要执行的命令,而命令是用于生成目标的具体操作。制表符用于将目标和命令区分开来。目标的后面必须跟一个冒号(:),然后是命令。命令必须以制表符开头。
  • 指定命令的缩进:Makefile 中的命令可以有多行,但只有第一行需要以制表符开头。后续行的缩进可以是制表符或空格,但必须一致。
  • 控制命令的执行顺序:Makefile 中的命令是按照顺序执行的。如果命令有多行,则第一行的制表符决定了该命令的执行顺序。制表符的数量越多,命令的执行顺序越靠后。

以下是一个简单的 Makefile 示例:

all:echo "Hello, world!"clean:rm -f hello.txt

在这个示例中,all 是目标,echo "Hello, world!" 是命令。命令以制表符开头,因此它将在 all 目标之后执行。

clean 是另一个目标,rm -f hello.txt 是命令。命令以制表符开头,因此它将在 clean 目标之后执行。

需要注意的是,Makefile 中的制表符和空格是严格区分的。如果使用空格代替制表符,则 Makefile 可能无法正确执行。

以下是一些使用制表符的注意事项:

  • 制表符的宽度:不同的编辑器可能会对制表符的宽度进行不同的设置。为了确保 Makefile 在不同的编辑器中都能正确执行,建议将制表符的宽度设置为 8 个空格。
  • 混合使用制表符和空格:在 Makefile 中,最好不要混合使用制表符和空格。如果需要使用空格进行缩进,则建议在所有行都使用空格,而不是只在某些行使用空格。

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

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

相关文章

SPP改进(多窗口池化)

论文创新点汇总:人工智能论文通用创新点(持续更新中...)-CSDN博客 原来的模型 15年提出 本质: 多个不同大小的池化窗口进行池化 池化窗口越大得到的特征越少 之后再将不同池化窗口得到的特征拼接起来 现在的改进 实现代码 class SPPCSPC(nn.Modul…

157基于matlab的GVF-snake算法能自动收敛到目标区域

基于matlab的GVF-snake算法能自动收敛到目标区域。关键技术GVF snake模型算法matlab源程序,GVF是根据光流场原理,利用变分方法,从图像中得到的一种向量场,该向量场被称为梯度矢量流(GVF)场。 Snake模型称为动态轮廓模型(Active Contour Model&#xff0…

详解结构体内存对齐及结构体如何实现位段~

目录 ​编辑 一:结构体内存对齐 1.1对齐规则 1.2.为什么存在内存对齐 1.3修改默认对齐数 二.结构体实现位段 2.1什么是位段 2.2位段的内存分配 2.3位段的跨平台问题 2.4位段的应用 2.5位段使用的注意事项 三.完结散花 悟已往之不谏,知来者犹可…

MATLAB环境下生成对抗网络系列(11种)

为了构建有效的图像深度学习模型,数据增强是一个非常行之有效的方法。图像的数据增强是一套使用有限数据来提高训练数据集质量和规模的数据空间解决方案。广义的图像数据增强算法包括:几何变换、颜色空间增强、核滤波器、混合图像、随机擦除、特征空间增…

四、案例 - Oracle数据迁移至MySQL

Oracle数据迁移至MySQL 一、生成测试数据表和数据1.在Oracle创建数据表和数据2.在MySQL创建数据表 二、生成模板文件1.模板文件内容2.模板文件参数详解2.1 全局设置2.2 数据读取(Reader)2.3 数据写入(Writer)2.4 性能设置 三、案例…

每日一题(最大连续1的个数,完全数计算)

485. 最大连续 1 的个数 - 力扣&#xff08;LeetCode&#xff09; #include <stdio.h> int findMaxConsecutiveOnes(int* nums, int numsSize) { if (numsSize 0) return 0; // 如果数组为空&#xff0c;返回0 int maxCount 0; // 最大连续1的个数 int currentCo…

使用耳机壳UV树脂制作私模定制耳塞的大小和形状对音质有影响吗?

使用耳机壳UV树脂制作私模定制耳塞的大小和形状对音质有影响。私模定制耳塞是根据用户的耳型定制的&#xff0c;因此其大小和形状与用户的耳朵形状相匹配&#xff0c;能够减少漏音和外部噪音的干扰&#xff0c;提供更好的音质体验。 具体来说&#xff0c;私模定制耳塞的大小和形…

分享96个jQuery特效,总有一款适合您

分享96个jQuery特效&#xff0c;总有一款适合您 96个jQuery特效下载链接&#xff1a;https://pan.baidu.com/s/1Pibj41ibHKTmdW7FHfRLjg?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理…

React+Antd实现表格自动向上滚动

1、效果 2、环境 1、react18 2、antd 4 3、代码实现 原理&#xff1a;创建一个定时器&#xff0c;修改表格ant-table-body的scrollTop属性实现滚动&#xff0c;监听表层的元素div的鼠标移入和移出实现实现鼠标进入元素滚动暂停&#xff0c;移出元素的时候表格滚动继续。 一…

【Godot4自学手册】第十三节初建创建敌人

从本节起&#xff0c;将要学习创建第一人。 一、创建敌人动画 1.导入素材。 在Sprites文件夹下新建Enemy文件夹&#xff0c;并将需要的敌人素材导入到文件夹。文档结构如下&#xff1a; 2.创建Enemy场景。 新建场景&#xff0c;根节点设置为CharacterBody2D&#xff0c;命…

最新wordpress外贸主题

日用百货wordpress外贸主题 蓝色大气的wordpress外贸主题&#xff0c;适合做日用百货的外贸公司搭建跨境电商网站使用。 https://www.jianzhanpress.com/?p5248 添加剂wordpress外贸建站主题 橙色wordpress外贸建站主题&#xff0c;适合做食品添加剂或化工添加剂的外贸公司…

使用MICE进行缺失值的填充处理

在我们进行机器学习时&#xff0c;处理缺失数据是非常重要的&#xff0c;因为缺失数据可能会导致分析结果不准确&#xff0c;严重时甚至可能产生偏差。处理缺失数据是保证数据分析准确性和可靠性的重要步骤&#xff0c;有助于确保分析结果的可信度和可解释性。 在本文中&#…

家政小程序系统源码开发:引领智能生活新篇章

随着科技的飞速发展&#xff0c;小程序作为一种便捷的应用形态&#xff0c;已经深入到我们生活的方方面面。尤其在家庭服务领域&#xff0c;家政小程序的出现为人们带来了前所未有的便利。它不仅简化了家政服务的流程&#xff0c;提升了服务质量&#xff0c;还为家政服务行业注…

工程问题与学术研究的融合 —— 校企合作

一、工程问题与学术研究的常规融合方法 工程问题与学术研究的融合通常体现在“产学研结合”的模式中&#xff0c;具体策略如下&#xff1a; 1. 需求导向&#xff1a;从实际工程问题出发&#xff0c;明确科研目标。在解决工程问题的过程中&#xff0c;识别出需要进一步研究的基…

Vue.js2+Cesium1.103.0 十五、计算方位角

Vue.js2Cesium1.103.0 十五、计算方位角 Demo <template><divid"cesium-container"style"width: 100%; height: 100%;"/> </template><script> /* eslint-disable no-undef */ /* eslint-disable new-cap */ /* eslint-disable n…

代码随想录算法训练营第三十天 | 重新安排行程、N皇后、解数独

目录 重新安排行程N皇后解数独总结 LeetCode 332.重新安排行程 LeetCode 51. N皇后 LeetCode 37. 解数独 重新安排行程 给定一个机票的字符串二维数组 [from, to]&#xff0c;子数组中的两个成员分别表示飞机出发和降落的机场地点&#xff0c;对该行程进行重新规划排序。所有…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 2月14日,星期三

每天一分钟&#xff0c;知晓天下事&#xff01; 2024年2月14日 星期三 农历正月初五 1、 第十四届全国冬季运动会将于17日开幕&#xff0c;部分赛事今天起陆续开赛。 2、 2024年购房政策将进一步宽松&#xff0c;专家称今年买房性价比更高。 3、 春节档票房突破45亿元&#…

docker 3.1 镜像

docker 3.1 镜像命令 拉取镜像 docker pull debian #从 Docker Hub 拉取名为 debian 的镜像docker pull hello-world #从 Docker Hub 拉入名为 hello-world 的镜像‍ 运行镜像/容器 docker run hello-world ‍ 查看本地所有的镜像 docker images​​ 容器生成镜像…

【数据结构】链表OJ面试题3《判断是否有环》(题库+解析)

1.前言 前五题在这http://t.csdnimg.cn/UeggB 后三题在这http://t.csdnimg.cn/gbohQ 记录每天的刷题&#xff0c;继续坚持&#xff01; 2.OJ题目训练 9. 给定一个链表&#xff0c;判断链表中是否有环。 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成…

如何使用六图一表七种武器

六图一表七种武器用于质量管理&#xff1a; 描述当遇到问题时应该用那张图来解决&#xff1a; 一、如果题目说出了质量问题需要找原因&#xff1f; 解&#xff1a;用因果图&#xff0c;因果图也称石川图或鱼骨图 二、如果要判断过程是否稳定受控&#xff1f; 解&#xff1a…