linux系统的编译命令怎么用

发布时间 - 2023-05-23 00:00:00    点击率:

linux系统的编译命令是“Make”。在linux系统中,make是一个非常重要的编译命令,管理员用它通过命令行来编译和安装很多开源的工具,程序员用它来管理他们大型复杂的项目编译问题。Make被用于自动化编译大型程序的任务,它可以自动检测程序中需要重新编译的部分,并下发相应的编译指令。

Make简介

make 是 linux 系统的实用程序。它被用来管理大型程序的自动编译任务,自动判断程序的哪个部分需要重新编译,并发送编译指令。虽然,我们最常见于 C 语言程序的编译。但是,make 不限于某一特定语言,凡是可以通过 shell 命令来运行编译器的语言都可以使用 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 testtest.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。


# linux  # 命令行参数  # 并发  # 自动化  # 你可以  # 如果你  # 这是  # 你想  # 你能  # 这是一个  # 执行文件  # 你对  # 可以使用  # 目录下 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  Laravel怎么连接多个数据库_Laravel多数据库连接配置  javascript日期怎么处理_如何格式化输出  Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  香港服务器选型指南:免备案配置与高效建站方案解析  Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中  微信小程序 require机制详解及实例代码  Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤  在Oracle关闭情况下如何修改spfile的参数  Android利用动画实现背景逐渐变暗  如何在宝塔面板中修改默认建站目录?  简单实现Android文件上传  香港服务器网站卡顿?如何解决网络延迟与负载问题?  北京网站制作公司哪家好一点,北京租房网站有哪些?  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  javascript事件捕获机制【深入分析IE和DOM中的事件模型】  Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】  Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案  南京网站制作费用,南京远驱官方网站?  Laravel怎么解决跨域问题_Laravel配置CORS跨域访问  Laravel如何配置任务调度?(Cron Job示例)  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  如何在IIS服务器上快速部署高效网站?  HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  Laravel如何处理异常和错误?(Handler示例)  百度输入法ai组件怎么删除 百度输入法ai组件移除工具  如何快速配置高效服务器建站软件?  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  如何为不同团队 ID 动态生成多个非值班状态按钮  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  如何快速重置建站主机并恢复默认配置?  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  JS经典正则表达式笔试题汇总  iOS验证手机号的正则表达式  Laravel如何自定义分页视图?(Pagination示例)  Laravel如何实现事件和监听器?(Event & Listener实战)  高防服务器租用指南:配置选择与快速部署攻略  如何在企业微信快速生成手机电脑官网?  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  详解jQuery停止动画——stop()方法的使用  Swift中循环语句中的转移语句 break 和 continue  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  Laravel中的Facade(门面)到底是什么原理  手机软键盘弹出时影响布局的解决方法  浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】  Laravel如何实现本地化和多语言支持?(i18n教程)  Java解压缩zip - 解压缩多个文件或文件夹实例  Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】  作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】