例解 Linux 下 Make 命令

linux命令--make -j和make all make -j和make all在Linux编译过程中各自扮演了不同的角色,具有不同的功能。 阅读详情

Linux 下 make 命令是系统管理员和程序员用的最频繁的命令之一。管理员用它通过命令行来编译和安装很多开源的工具,程序员用它来管理他们大型复杂的项目编译问题。本文我们将用一些实例来讨论 make 命令背后的工作机制。


Make 如何工作的


对于不知道背后机理的人来说,make 命令像命令行参数一样接收目标。这些目标通常存放在以 “Makefile” 来命名的特殊文件中,同时文件也包含与目标相对应的操作。更多信息,阅读关于 Makefiles 如何工作的系列文章。


当 make 命令第一次执行时,它扫描 Makefile 找到目标以及其依赖。如果这些依赖自身也是目标,继续为这些依赖扫描 Makefile 建立其依赖关系,然后编译它们。一旦主依赖编译之后,然后就编译主目标(这是通过 make 命令传入的)。


现在,假设你对某个源文件进行了修改,你再次执行 make 命令,它将只编译与该源文件相关的目标文件,因此,编译完最终的可执行文件节省了大量的时间。


Make 命令实例


下面是本文所使用的测试环境:


OS —— Ubunut 13.04

Shell —— Bash 4.2.45

Application —— GNU Make 3.81


下面是工程的内容:


$ ls

anotherTest.c Makefile test.c test.h


下面是 Makefile 的内容:


all: test

 

test: test.o anotherTest.o

    gcc -Wall test.o anotherTest.o -o test

 

test.o: test.c

    gcc -c -Wall test.c

 

anotherTest.o: anotherTest.c

    gcc -c -Wall anotherTest.c

 

clean:

    rm -rf *.o test


现在我们来看 Linux 下一些 make 命令应用的实例:


1. 一个简单的例子


为了编译整个工程,你可以简单的使用 make 或者在 make 命令后带上目标 all。


$ make

gcc -c -Wall test.c

gcc -c -Wall anotherTest.c

gcc -Wall test.o anotherTest.o -o test


你能看到 make 命令第一次创建的依赖以及实际的目标。

如果你再次查看目录内容,里面多了一些 .o 文件和执行文件:


$ ls

anotherTest.c anotherTest.o Makefile test test.c test.h test.o


现在,假设你对 test.c 文件做了一些修改,重新使用 make 编译工程:


$ make

gcc -c -Wall test.c

gcc -Wall test.o anotherTest.o -o test


你可以看到只有 test.o 重新编译了,然而另一个 Test.o 没有重新编译。

现在清理所有的目标文件和可执行文件 test,你可以使用目标 clean:


$ make clean

rm -rf *.o test

 

$ ls

anotherTest.c Makefile test.c test.h


你可以看到所有的 .o 文件和执行文件 test 都被删除了。


2. 通过 -B 选项让所有目标总是重新建立


到目前为止,你可能注意到 make 命令不会编译那些自从上次编译之后就没有更改的文件,但是,如果你想覆盖 make 这种默认的行为,你可以使用 -B 选项。


下面是个例子:


$ make

make: Nothing to be done for `all’.

 

$ make -B

gcc -c -Wall test.c

gcc -c -Wall anotherTest.c

gcc -Wall test.o anotherTest.o -o test


你可以看到尽管 make 命令不会编译任何文件,然而 make -B 会强制编译所有的目标文件以及最终的执行文件。


3. 使用 -d 选项打印调试信息


如果你想知道 make 执行时实际做了什么,使用 -d 选项。


这是一个例子:


$ make -d | more

GNU Make 3.81

Copyright (C) 2006 Free Software Foundation, Inc.

This is free software; see the source for copying conditions.

There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A

PARTICULAR PURPOSE.

 

This program built for x86_64-pc-linux-gnu

Reading makefiles…

Reading makefile `Makefile’…

Updating makefiles….

Considering target file `Makefile’.

Looking for an implicit rule for `Makefile’.

Trying pattern rule with stem `Makefile’.

Trying implicit prerequisite `Makefile.o’.

Trying pattern rule with stem `Makefile’.

Trying implicit prerequisite `Makefile.c’.

Trying pattern rule with stem `Makefile’.

Trying implicit prerequisite `Makefile.cc’.

Trying pattern rule with stem `Makefile’.

Trying implicit prerequisite `Makefile.C’.

Trying pattern rule with stem `Makefile’.

Trying implicit prerequisite `Makefile.cpp’.

Trying pattern rule with stem `Makefile’.

--More--


这是很长的输出,你也看到我使用了 more 命令来一页一页显示输出。


4. 使用 -C 选项改变目录


你可以为 make 命令提供不同的目录路径,在寻找 Makefile 之前会切换目录的。


这是一个目录,假设你就在当前目录下:


$ ls

file file2 frnd frnd1.cpp log1.txt log3.txt log5.txt

file1 file name with spaces frnd1 frnd.cpp log2.txt log4.txt


但是你想运行的 make 命令的 Makefile 文件保存在 ../make-dir/ 目录下,你可以这样做:


$ make -C ../make-dir/

make: Entering directory `/home/himanshu/practice/make-dir’

make: Nothing to be done for `all’.

make: Leaving directory `/home/himanshu/practice/make-dir


你能看到 make 命令首先切到特定的目录下,在那执行,然后再切换回来。


5. 通过 -f 选项将其它文件看作 Makefile


如果你想将重命名 Makefile 文件,比如取名为 my_makefile 或者其它的名字,我们想让 make 将它也当成 Makefile,可以使用 -f 选项。


make -f my_makefile


通过这种方法,make 命令会选择扫描 my_makefile 来代替 Makefile。


来源:hazir 

连接 : http://www.cnblogs.com/hazir/p/linux_make_examples.html


安装源代码软件 问题 1)编译安装httpd网站服务软件,开启httpd服务并确认结果 2)编译安装aria2下载工具 方案 首先要准备开发环境,可以利用yum安装gcc、make等工具,或安装开发工具软件包组。 1)解包 tar 【释放源代码至指定目录】 2)配置 【指定安装目录/功能模块等选项】 ./configure --prefix=安装目录 ** 查看配置帮助 ./configure ... 阅读详情

相关推荐

【Linux操作系统】自动化编译make和Makefile

`make`是一个构建C++项目的**工具/命令**;`makefile`是一个包含编译命令的脚本**文件**。通过make工具解释makefile文件中的命令,进行我们的项目编译。

每天都要坚持刷题的博客 3231

linux make 命令行 定义宏(-D)传递给C源代码 简介

需求: 通常使用 -dname=值 从“make命令行”传递给“makefile”。 该定义可在makefile中访问。 想使用 编译器选项 将宏定义从“makefile”传递到“源代码”:-Dname = value。 可以在源代码中访问此定义。 如用户可以输入:make -f mymakefile.mk -SOMEOPTION var = 5 然后直接代码main.c可以看到var: int main() { int i = var; } 解决: make CFLAGS=-Dvar

whatday的专栏 9633

EMC工程师职业发展:从测试整改到系统设计的进阶之路

电磁兼容(EMC)是确保电子设备在复杂电磁环境中可靠工作的关键技术,其核心在于控制电磁干扰(EMI)并提升抗扰度。其基本原理涉及电磁场理论、噪声耦合路径与滤波屏蔽技术。对于电子产品而言,EMC设计直接关系到能否通过CE、FCC等强制性认证,是产品上市和市场竞争力的关键。在工程实践中,EMC工程师需要从电路设计、PCB布局、元器件选型等源头入手,将EMC要求融入产品开发全流程,实现从后期“整改”到前期“设计预防”的价值跃迁。本文聚焦EMC工程师的核心能力体系构建与职业发展路径,深入探讨了如何从掌握标准测试、电

weixin_30819085的博客 389

make的命令行选项

http://www.linuxsir.org/main/doc/gnumake/GNUmake_v3.80-zh_CN_html/make-09.html这些参数可以通过man手册查看(红色是比较有用的选项):-b-m忽略,提供其它版本make兼容性。-B--always-make强制重建所有规则的目标,不根据规则的依赖描述决定是否重建目标文件。-C DIR--directory=DIR在读取M...

william_djj的专栏 553

Windows 64 位系统下安装配置 DOSBox 及 debug.exe

该篇博客同样作为类似问题 “如何在 Windows 64 位系统下进入 debug” 的答案。 很多同学初看王爽的《汇编语言》,或者因为其它原因需要进入 debug 调试模式下学习汇编语言的时候,会发现进入不了,出现类似以下的错误提示。 这是因为他们使用的是 64 位的 Windows 系统(Win 7,Win 8 以及 Win 10 等),而 64 位 Windows 系统不再支持在命令提示符窗口下进入 debug 调试模式。那么对于使用 64 位 Windows 系统的用户来说,该怎样才能够顺利进入 d

加号减减号的博客 5万+

WSL 运行make提示/lib/modules/xxx/build: No such file or directory. Stop.错误解决办法

WSL运行make提示/lib//modules/xxx文件或目录不存在。 WSL2的内核是修改过的,无法使用 ubuntu上游的内核头文件和modules文件,因此,我们需要手动编译并安装一个版本。

weixin_45668903的博客 1万+

例解 Linux 下 make 命令

Linux 下 make 命令是系统管理员和程序员用的最频繁的命令之一。管理员用它通过命令行来编译和安装很多开源的工具,程序员用它来管理他们大型复杂的项目编译问题。本文我们将用一些实例来讨论 make 命令背后的工作机制。 Make 如何工作的 对于不知道背后机理的人来说,make 命令像命令行参数一样接收目标。这些目标通常存放在以 “Makefile” 来命名的特殊文件中,同时文

海风林影 1727

复旦微实现串口在线升级BOOT.BIN

将该 demo 生成的 app(升级用)和 fsbl、最简化 bit 文件(可选)打包成 BOOT.BIN,作为 golden image 烧写在 qspi flash 偏移 0 地址开始的位置,其中最简化 bit 文件为在线升级功能提供必要的物理通道(如果不需要,可以不打包该文件),golden image 一旦发布基本不需要进行升级,由该 golden image 负责和上位机进行通信交互,完成业务 app、业务 bit 文件、uboot 以及操作系统 image 等文件在线升级,在qspi flash

wangjie36的博客 3174

Linux 下的make命令与Makefile

概述 博客内容包含linux下make命令的使用与makefile的书写规则等,希望通过本文档使读者对make命令makefile文件有进一步了解,由于鄙人经验学识有限文档中会有描述不准确以及理解偏差,欢迎读者指正。fythons@sina.com 从一只猫说起hello kitty linux系统中的make命令与makefile文件 make与makefile 在linux系统...

Fythons的博客 11万+

【YOLOv12[基础]】热力图可视化实践 | 脚本升级 | 优化可视化效果 | 论文必备 | GradCAMPlusPlus, GradCAM, XGradCAM, EigenCAM等

热力图可视化实践 | 脚本升级 | 优化可视化效果 | 论文必备 GradCAMPlusPlus, GradCAM, XGradCAM, EigenCAM等

静谧、淡雅 895

华为OD机试 - 取出尽量少的球 - 感谢@吴修柯反馈(Python/JS/C/C++ 双机位A卷 200分)

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。感谢@吴修柯反馈,2025-03-22,A卷200分考试真题。某部门开展 Family Day 开放日活动,其中有个从桶里取球的游戏。有 N 个容量一样的小桶等距排开,且每个小桶都默认装了数量不等的小球,每个小桶装的小球数量记录在数组 bucke

学Java,找哪吒 1486

Linux中make, make install命令分别是什么,用法?

Linux中make, make install命令的作用,以及其他make命令 make是用来编译的,它从baiMakefile中读取指令,然后编译。 make install是用来du安装zhi的,它也从Makefile中读取指令,安装到指定的位置dao。 用法: 1、make: 这一步就是编译,大多数的源代码包都经过这一步进行编译(当然有些perl或python编写的软件需要调用perl或python来进行编译)。 如果 在 make 过程中出现 error ,就要记下错误代码(注意不仅仅是最后一行)

qq_40603010的博客 5万+

注意力机制模块:二次创新:CBAM 与 ECA 融合形成 CECA 模块,参数量减少 40%

文章摘要: 本文提出一种轻量化注意力模块CECA,通过融合CBAM和ECA的优势解决模型部署中的精度与速度矛盾。CBAM虽具备通道和空间双重注意力,但参数量大;ECA轻量但缺乏空间注意力。CECA采用ECA的一维卷积替换CBAM的通道注意力部分,保留其空间注意力模块,在保持双注意力能力的同时减少40%参数量。实验表明该方案在边缘设备部署中能维持精度并提升推理速度,特别适用于YOLO等目标检测模型的轻量化改进。文章详细拆解了架构设计、代码实现及参数量优化原理,为算法工程师和嵌入式开发者提供了实用解决方案。

ZXSXJ的博客 237
上一篇: Linux 命令行工具使用小贴士及技巧(1)
下一篇: 我在阅读 NodeJS 文档中读出的19个套路
bb_it007
博客等级 码龄10年 15粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值