在Ubuntu下使用makefile编译C语言工程

35 篇文章 9 订阅
34 篇文章 8 订阅

一、项目开始

首先我们创建项目文件夹

mkdir study01

跳转到目录

cd study01

创建项目需要的文件

touch main.c  app.c app.h Makefile

然后我们编写app程序.c程序


#include <stdio.h>
#include "app.h"

int add(int x, int y)
{
	return x + y;
}

int sub(int x, int y)
{
	return x - y;
}

.h文件

#ifndef __APP_H
#define __APP_H


// 返回两个数的和
int add(int x, int y);

// 返回两个数的差
int sub(int x, int y);


#endif 

编写主程序文件

#include <stdio.h>
#include "app.h"

int main(int argc, char* argv[])
{
        int num1 = 100, num2 = 55;
        int value = 0;

        value = add(num1, num2);
        printf("%d + %d = %d\r\n", num1, num2, value);
        value = sub(num1, num2);
        printf("%d - %d = %d\r\n", num1, num2, value);

        return 0;
}

二、第一个Makefile

最后来完成本章内容的核心Makefile

main:app.o main.o
	gcc  app.o main.o -o main 

这一句的以上可以理解为main这个可执行文件需要依赖app.o和main.o文件生成
然后下面一句是生成main文件需要执行的语句。

app.o:app.c
        gcc -c app.c

main.o:main.c
        gcc -c main.c

可以用上一段代码的方式同样理解生成app.o文件需要依赖app.c,如何生成呢,使用gcc -c app.c

clean:
        rm *.o
        rm main

删除生成的文件,这一句的意思的调用make clean就回执行rm *.o删除工程下所有.o的文件rm main表示删除main文件(不带.c),到这里我们就得到了一个完整的工程

main:app.o main.o
        gcc app.o main.o -o main

app.o:app.c
        gcc -c app.c

main.o:main.c
        gcc -c main.c

clean:
        rm *.o
        rm main

在这里插入图片描述
在这里插入图片描述

然后我们输入make就可以看到编译过程中使用到的指令,然后输入ls就可以看到main文件已经生成了然后执行main文件就可以得到和手动编译一样的效果了,最后我们可以执行make cleam可以看到刚刚生成的文件已经删除了,对于需要多次使用到的文件我们可以使用变量来进行封装,所以这里再补充一个makefile变量的知识点:

object = app.o main.o

main:$(object)
        gcc $(object) -o main

app.o:app.c
        gcc -c app.c

main.o:main.c
        gcc -c main.c

clean:
        rm *.o
        rm main

object就是变量他的值就是app.o main.o 这里引用变量的方式就是$(object)

注意:makefile文件中的命令必须以TAB来开始,不能使用空格

三、Makefile运算符

1、“=”给变量赋值

object = app.o main.o

2、“:=”不随变量的改变而改变

object = app.o main.o
temp = $(object)
object = main.o

最后temp的值为app.o main.o而不是object最后的main.o

3、“?=”如果变量前面已经有数值了就采用已经赋值的内容,没有则采用新内容

object = world
object ?= hello

最后object的值为world

4、“+=”和普通的变成语言一样追加变量数值

object = hello
object += world

最后object的值为 hello world
在这里插入图片描述

四、自动化变量

当存在一些不确定的文件名和工程中需要生成文件过多的时候我们就不得不考虑匹配生成了,而自动化变量就可以完成这个功能。
在这里插入图片描述
我们使用自动化变量优化一下我们上面的Makefile文件


object = app.o main.o

main:$(object)
        gcc app.o main.o -o main

%.o:%.c
        gcc -c $<

clean:
        rm *.o
        rm main

然后我们就得到了更精简的makefile文件,这里不需要全部都了解,只需要理解比较常用的三种自动化变量: @ 、 @、 @<和$^,具体的可以再看看详细的自动化变量的解释,这里博主也不是非常的熟练。

五、Makefile伪目标

当我们工程中存在了不会改变的文件和我们Makefile文件中的对象重复,那么我们的对象将不会执行,比如在我们上诉的工程中添加一个clean的文件,
在这里插入图片描述
这个文件我们也不会用也不会去改变他,但是Makefile文件中的clean对象会认为这个文件不需要依赖也就不会带来改变也就一直不会去执行clean下面的命令,所以我们就需要将clean定义为伪目标,方法很简单,将需要作为伪目标的对象添加一句。

.PHONY : clean

在这里插入图片描述

六、条件判断

ifeqifeq(arg1,arg2) 比较参数arg1和arg2的值,相同返回true
ifneqifneq(arg1,arg2)比较参数arg1和arg2的值,不同返回true
ifdefifdef 如果变量的值非空,返回true
ifndefifndef 如果变量的值为空,返回true
在这里插入图片描述

七、函数

1、函数 subst

函数 subst 用来完成字符串替换,调用形式如下:

$(subst <from>,<to>,<text>)

此函数的功能是将字符串 中的内容替换为,函数返回被替换以后的字符
串,比如如下示例:

$(subst ubuntu,makefile,hello ubuntu)

把字符串“hello ubuntu”中的“ubuntu”替换为“makefile”,替换完成以后的字符串为“hello makefile”。

2、函数 patsubst

函数 patsubst 用来完成模式字符串替换,使用方法如下:

$(patsubst <pattern>,<replacement>,<text>)

此函数查找字符串 中的单词是否符合模式,如果匹配就用来
替换掉,可以使用通配符“%”,表示任意长度的字符串,函数返回值就是替换后的字
符串。如果中也包涵“%”,那么中的“%”将是中的那个
“%”所代表的字符串,比如:

$(patsubst %.c,%.o,a.c b.c c.c)

将字符串“a.c b.c c.c”中的所有符合“%.c”的字符串,替换为“%.o”,替换完成以后的字
符串为“a.o b.o c.o”。

3、函数 dir

函数 dir 用来获取目录,使用方法如下:

$(dir <names…>)

此函数用来从文件名序列中提取出目录部分,返回值是文件名序列的目录
部分,比如:

$(dir </src/a.c>)

提取文件“/src/a.c”的目录部分,也就是“/src”。

4、函数 notdir

函数 notdir 看名字就是知道去除文件中的目录部分,也就是提取文件名,用法如下:

$(notdir <names…>)

此函数用与从文件名序列中提取出文件名非目录部分,比如:

$(notdir </src/a.c>)

提取文件“/src/a.c”中的非目录部分,也就是文件名“a.c”。

5、函数 foreach

foreach 函数用来完成循环,用法如下:

$(foreach <var>, <list>,<text>)

此函数的意思就是把参数中的单词逐一取出来放到参数中,然后再执行
包含的表达式。每次 都会返回一个字符串,循环的过程中, 中所包含的每个字符串
会以空格隔开,最后当整个循环结束时, 所返回的每个字符串所组成的整个字符串将会是
函数 foreach 函数的返回值。

6、函数 wildcard

通配符“%”只能用在规则中,只有在规则中它才会展开,如果在变量定义和函数使用时,
通配符不会自动展开,这个时候就要用到函数 wildcard,使用方法如下:

$(wildcard PATTERN…)

比如:

$(wildcard *.c)

上面的代码是用来获取当前目录下所有的.c 文件,类似“%”

ps:在直接复制文章中Makefile的时候需要注意使用的时候要将空格替换成【tab】直接复制的Makefile不会复制成tab格式,这里感谢网友@m0_60722015 提醒

  • 7
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
### 回答1: Ubuntu编写Makefile文件的步骤如下: 1. 创建一个新的文件夹,用于存放源代码和Makefile文件。 2. 在该文件夹中创建源代码文件,例如main.c。 3. 创建Makefile文件,命名为Makefile。 4. 在Makefile文件中定义变量,例如CC和CFLAGS。 5. 定义目标文件和依赖关系,例如main.o: main.c。 6. 定义生成可执行文件的规则,例如gcc -o main main.o。 7. 在终端中进入该文件夹,运行make命令生成可执行文件。 8. 运行生成的可执行文件,例如./main。 以上就是Ubuntu编写Makefile文件的基本步骤。 ### 回答2: Ubuntu是一种流行的Linux操作系统,而Makefile是一种对于软件项目的自动化构建非常重要的工具。在Ubuntu上编写Makefile文件需要遵循以下步骤: 1.打开终端,进入Makefile所在的目录。 2.创建一个名为Makefile的空文件,可以使用vim、nano等编辑器进行创建。 3.在Makefile文件中,首先需要声明目标文件(target)和相关依赖(dependencies),例如: target: dependency1 dependency2 … 在这个声明中,target表示所需生成的文件名,dependencies表示所依赖的文件列表,需要在生成target之前完成。 4.接下来需要编写生成目标文件的指令,例如: target: dependency1 dependency2 … command1 command2 … 在这个指令中,command1、command2等表示需要执行的命令,生成目标文件。 5.最后需要声明清理指令,以便在目录中执行make clean时能清理掉生成的中间文件,例如: clean: rm -f target 在这个指令中,rm -f target表示需要删除生成的目标文件target。 6.保存Makefile文件后,在终端中执行make指令即可生成目标文件。如果需要清理中间文件,则可执行make clean指令。 总之,在Ubuntu中编写Makefile文件需要对目标文件、依赖、指令等有比较全面的了解,并且需要遵循一定的规范和语法。只有这样,才能够更加高效地完成项目的自动化构建。 ### 回答3: 在Ubuntu上编写Makefile文件需要先安装gcc和make工具。gcc是GNU的C语言编译器,可以将C语言代码转化为可执行文件。而make是一个工程自动化构建工具,可以根据Makefile文件进行编译、链接、打包等操作。 1. 创建文件夹并在其中创建源文件和Makefile文件 首先,在终端中创建一个新的文件夹,并在其中创建C语言源文件和Makefile文件。可以使用以下命令: ``` mkdir my_project cd my_project touch main.c touch Makefile ``` 2. 编写源文件 在main.c文件中编写C语言源代码。这里给出一个简单的例子: ``` #include <stdio.h> int main() { printf("Hello, world!\n"); return 0; } ``` 3. 编写Makefile文件 在Makefile文件中,需要定义编译规则、链接规则等。以下是一个简单的Makefile文件: ``` CC = gcc CFLAGS = -Wall all: my_project my_project: main.o $(CC) main.o -o my_project main.o: main.c $(CC) -c $(CFLAGS) main.c clean: rm -f *.o my_project ``` 这个Makefile文件包含三个规则: * all: 定义了一个默认的目标,即执行make命令时,会默认执行该规则。在这里,该规则需要执行my_project规则。 * my_project: 定义了一个编译和链接规则。该规则需要将main.c文件编译为main.o目标文件,然后链接生成可执行文件my_project。 * main.o: 定义了一个编译规则,该规则需要将main.c文件编译为main.o目标文件。 还有一个clean规则,用于清除生成的目标文件和可执行文件。 4. 执行make命令 在终端中进入my_project文件夹,并执行make命令。如果没有错误,会生成可执行文件my_project。 ``` cd my_project make ``` 执行生成的可执行文件: ``` ./my_project ``` 输出结果为: ``` Hello, world! ``` 以上就是在Ubuntu上编写Makefile文件的基本过程。Makefile文件是非常灵活和强大的工具,可以实现复杂的编译和构建工作。掌握使用Makefile文件可以在工程开发中提高效率和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凉开水白菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值