Makefile(面试必备)

2023-11-02

1.Makefile基本介绍

1.1 makefile介绍

make是一个工程管理器,它可以根据文件时间自发检测更新的文件从而减少编译量,makefile文件和make工具一起使用,用于控制工程项目的编译和链接,也可以用来编写手册页和程序的安装。make工具用于解释执行makefile文件中的内容。makefile文件中通常包含源文件和目标文件的依赖关系以及从源文件生成目标文件的规则。make工具可以根据makefile判断哪些文件需要被重新编译,目标文件的构建顺序等。
 

1.2 makefile文件名

make会自动识别GUNmakefile,makefile,Makefile,最好使用Makefile,有的系统不会检测别的文件名。

当然可以使用 make -f xxx 指定文件,建立的时候尽量使用makefilexxx

1.3 makefile规则

目标:依赖

           命令

目标:可以使文件名,也可以是标签,但必须存在。如果是标签作为第一个,会被一直执行。

依赖:可以使文件名,字符等。可以没有

命令:从行首加入Tab键,可以没有

test.o:test.s
	gcc -c test.s -o test.o

注意:规则与规则之间没有必然的顺序关系

           第一条的目标会成为终极目标

           使用make之前需要把系统时间纠正准确,因为makefile是根据时间来进行编译的

假设先对fun1.c进行修改,然后删除原来的fun1.c和fun1.out,在重新复制出来,此时虽然是原先的文件.

          但是fun1.o和app的时间都改变了,系统检测到时间相比上次发生改变,则不给予执行。

2.makefile结构组成与执行步骤

2.1显式规则

       显式规则说明了,如何生成一个或多的的目标文件。这是由Makefile的编写人员明显指出,要生成的文件,文件的依赖文件,生成的命令。

sr1=test.c
G=gcc
#include tes.mk
#AAA=$(patsubst *.c,*.o $(notdir $(wildcard /root/test1/714/*.c)))
#	echo "$(AAA)"
test.out:test.o
	gcc test.o -o $@
test.o:test.s
	gcc -c test.s -o test.o
#	echo "$(test)"
%.s:%.i
	${G} -S $^ -o $@
test.i:${sr1}
	${G} -E $^ -o $@

2.2隐晦规则

有一点需要注意的是,"%"的展开发生在变量和函数的展开之后,变量和函数的展开发生在make载入Makefile时,而模式规则中的"%"则发生在运行时。

2.3变量定义

(1)变量在定义的时候需要给定初始值,一般在使用变量的时候加上“$(变量名称)”或者“${变量名称}”,推荐(),如果存在函数有色态提醒

SS=test.c
app:$(SS)
    gcc $(SS) -o app

(2)运算符:

=:延时展开赋值

A=$(B)
B=hello
    echo "$(A)"


结果:
echo "hello"
hello

:=:立即赋值

A:=$(B)
B=hello
    echo "$(A)"


结果:
echo ""
\r\n

+=:追加赋值

A=$(B)
B=HELLO
B+=1111
app:
	echo "$(A)"


结果:
echo "HELLO 1111"
HELLO 1111
  

?=:判断变量是否赋值,如果之前已经赋值,则不赋值,否则,赋值

fliet=1
fliet?=2  //判断是否赋值过
A=$(fliet)
app:
    echo "$(A)"

结果:
echo "1"
1

屏蔽fliet=1
echo "2"
2

 

$$:$

$^:   规则中所有依赖

$<:代表规则中的第一个依赖名,如果是隐晦规则,则代表由隐晦规则加入的第一个依赖文件名,配合%等规则使用

$@:当前规则的目标名称

@:不显示在标准输出/

2.4文件指示

      make命令开始时,会把找寻找include所指出的其它Makefile,并把其内容安置在当前的位置。就好像C/C++的#include指令一样。

      如果有文件没有找到的话,make会生成一条警告信息,但不会马上出现致命错误。它会继续载入其它的文件,一旦完成makefile的读取,make会再重试这些没有找到,或是不能读取的文件,如果还是不行,make才会出现一条致命信息。如果你想让              make不理那些无法读取的文件,而继续执行,你可以在include前加一个减号“-”。如:-include<filename>

vim test.mk
写入A=HELLO

vim makefile

include test.mk
    echo "A"

结果:
HELLO

2.5伪目标

指定标签运行:(make -f xxfile clean)

clean:
	rm *.out test
.PHONY:clean

2.6执行步骤

加载makefile文件——>展开inlcude下的makefile文件——>变量初始化——>推导隐晦规则,分析所有规则

——>为目标文件创建依赖关系链——>根据依赖关系决定哪些需要真正生成——>执行

makefile中如果变量使用了,在创建依赖关系链的时候并不会马上展开,如果变量所存在的依赖中最后被使用了,才会真正展开

3.makefile函数

3.1匹配指定目录下文件

3.2去除文件路径

3.3模式替换函数

3.4反过滤函数

2.静态库与动态库

(1).静态库:

编译的时候整个库会加载到目标代码中。

优点:编译后不需要外部函数库的支持,运行速度快

缺点:如果静态库改变后,代码需要重新编译,编译的文件相对于动态库大

步骤:

(2)动态库:

     编译的时候不会加载到目标代码中,只是保留了相关接口,程序执行过程用到才会被加载。

     优点:编译工程量比较少,库与代码相对独立,库升级不影响程序的使用

     缺点:加载速度慢。

    步骤:          

动态库就在当前目录下,为什么操作系统会提示找不到该文件呢?

原因:操作系统默认从标准位置寻找相应的库:/lib、/usr/lib、usr/local/lib。但如果没有找到依赖的库文件,则从LD_LIBRARY_PATH环境变量里寻找。

也就是说,动态库文件要么放在标准位置,要么放在LD_LIBRARY_PATH指定的位置,才能被操作系统找到。

解决方法:

1)通过环境变量,export LD_LIBRARY_PATH=动态库路径

export LD_LIBRARY_PATH=./lib 临时生效,终端重启环境变量失效   //决定动态库的搜素路径。

2)永久生效:“export LD_LIBRARY_PATH=动态库路径”写入到终端配置文件 ~/.bashrc 建议使用绝对路径。

3)拷贝自定义动态库到标准位置中

3.Makefile练习

(1)使用makefile编译指定路径下的所有.c文件生成.o,同时生成可执行文件

4,自动生成Makefile文件

 

图上圆形表示命令,方形表示文件,斜体表示需要自己编写或者修改的文件。

 

  1. 在存放源代码的目录下执行autoscan命令生成configure.scan文件;

  2. 将configure.scan文件改名为configure.in或者configure.ac(早起使用.in后缀),并对其默认配置进行修改;

  3. 执行aclocal、autoconf两个命令,分别生成aclocal.m4、configure文件;

  4. 执行autoheader命令,扫描configure.ac文件,生成config.h.in文件;

  5. 创建一个名为Makefile.am的文件,并输入相应的内容。

  6. 执行automake,它根据Makefile.am文件,生成Makefile.in。

  7. 执行./configure脚本文件,它根据Makefile.in文件,生成最终的Makefile文件

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Makefile(面试必备) 的相关文章

随机推荐

  • tutk云平台服务器_哪家云服务器便宜?各家云平台活动详解【持续更新】

    不知不觉 双十一已经近在眼前 作为一年一度的购物狂欢节 无论对于商家还是消费者来说 都是一次畅快购物的饕餮盛宴 对于云平台来说 自然不会错过一年中绝佳的营销机会 各种优惠活动也是纷至沓来 在讨论哪家云服务器便宜之前 我们先来看看该如何选择云
  • 微信登录总结公众号登录小程序登录企业微信登录

    微信公众号 服务号登录 微信内部网页授权 第一步 请求CODE https open weixin qq com connect oauth2 authorize appid APPID redirect uri REDIRECT URI
  • VC6.0打开文件以及向工程中添加文件时程序崩溃自动退出

    换了一台电脑 vc6 0程序中 点击打开文件以及向工程中添加文件时 程序竟然崩溃自动退出了 不知什么原因 安装相同的vc程序 本本竟然出现此缘故 但是这个操作又是自己经常用到的 所以不得不解决 与上一台电脑不同的是 此电脑是win7系统 而
  • 最小二乘拟合平面——拉格朗日乘子法

    目录 一 算法原理 二 代码实现 1 python 2 matlab 三 算法效果 一 算法原理 设拟合出的平面方程为 a x b
  • tinyhttp

    博客园 http www cnblogs com letlifestop Tinyhttpd 是J David Blackstone在1999年写的一个不到 500 行的超轻量型 Http Server 用来学习非常不错 可以帮助我们真正理
  • c++中和c语言不相同的地方

    c 糅合了c语言的语法 并且在c语言的基础上进行了改进 并且具有向下兼容的特性 但是c 改进了什么东西呢 今天就来学习一下吧 目录 命名空间 namespace cout与cin与endl 流插入符与流运算符 using namespace
  • [MySql]JDBC编程

    JDBC 即Java Database Connectivity java数据库连接 是一种用于执行SQL语句的Java API 它是Java中的数据库连接规范 这个API由 java sql javax sql 包中的一些类和接口组成 它
  • Vite unplugin-auto-import插件 自动引入组件

    文章目录 一 参考 二 快速入门 三 开发问题 3 1 解决eslint 报错的问题 3 2 解决 typescritp 报错的问题 unplugin auto import 自定义配置说明 一 参考 unplugin auto impor
  • QT textBrowser 设置每个字符串的颜色和大小

    QT textBrowser 设置每个字符串的颜色和大小 QT中textBrowser每行显示不同颜色 解决 Qt textBrowser 每行字体设置中的 n 缺失问题 原理 字体采用 html语言进行设置 方法 1 需要采用 appen
  • windows10 mvn安装后不是内部命令

    好气啊 maven 命令不识别 扒拉了半天 结果把全路径仍path一份就好使了 先记着吧
  • VS2010中C#调用C函数

    VS2010中C 调用C函数 2013 07 22 16 12 50 转载 分类 C Concept 1 创建C本地DLL文件 1 1 创建Win32Dll项目 1 2 创建DLL 点击完成 1 3 在 头文件 里新建文件 CPPLibra
  • 最小点覆盖问题详解

    那么一如既往 还是个人觉得学习某一个知识点之前先粗俗的了解其是个什么东东 然后再去了解概念比较好 那么下面结合题目来了解 首先最最重要的是理解题意 有k个任务 每个任务task i可以用机器A的x i模式做 也可以由机器B的y i模式做 值
  • 6款非常好用的设计软件盘点

    近年来 随着社会的发现 中国的设计行业也取得了快速的进步 人们对设计的要求越来越高 设计师也越来越多 设计成本也在上升 作为一名设计师 找到合适的设计软件尤为重要 以下是一些我认为有用的设计软件 供您参考 1 figma Figma是一个U
  • Linux网络莫名其妙ping不通外网

    做实验之前 网络设置一切正常 一开始能成功ping通外网 但是过一会儿就出问题 yum也用不了 查了所有的配置都没有任何问题 最后尝试了一下将原来的网段更换 将虚拟机里的虚拟网络编辑器NAT模式的子网IP更换一个网段 原来是158网段 现更
  • 利用Github快速搭建个人博客总结(亲测)

    近一年多时间一直都在用CSDN 讲真这个CSDN有时候资料很多 我也很自豪加入这个大家庭 不过身边有两个同学 一个在github托管了属于自己的博客 另一个在云上面编写了属于自己的博客 后者的理由是 CSDN太low 上面很多都是转发的文章
  • 机器学习—支持向量机理论详细推导(含例题讲解)(二)

    7 最大间隔算法 算法 输入 T x 1
  • 修改镜像配置后 启动docker失败

    背景 systemctl start docker失败 输出如下 systemctl restart docker Job for docker service failed because the control process exit
  • 机器学习中的类别不均衡问题

    基础概念 类别不均衡 指在分类算法中 不同样本类别的比例悬殊比较大 会对算法的学习过程造成重大干扰 比如 一个二分类的问题上 有1000个样本 其中5个正样本 995个负样本 在这种情况下 算法只需将所有的样本预测为负样本 那么它的精度也可
  • FTP协议详解

    一 FTP协议的概述 1 文件传送协议 File Transfer Protocol 是互联网上使用的最广泛的文件传输协议 用于Internet上的控制文件的双向传输 2 FTP提供交互式的访问 允许客户指明文件类型与格式 并允许文件具有存
  • Makefile(面试必备)

    1 Makefile基本介绍 1 1 makefile介绍 make是一个工程管理器 它可以根据文件时间自发检测更新的文件从而减少编译量 makefile文件和make工具一起使用 用于控制工程项目的编译和链接 也可以用来编写手册页和程序的