Linux学习笔记——例说makefile 单个C文件

0.前言

从学习C语言开始就慢慢开始接触makefile,查阅了很多的makefile的资料但总感觉没有真正掌握makefile,如果自己动手写一个makefile总觉得非常吃力。所以特意借助博客总结makefile的相关知识,通过例子说明makefile的具体用法。

例说makefile大致分为4个部分

1.只有单个C文件

2.含有多个C文件

3.需要包括头文件路径

4.一个较为复杂的例子

【代码仓库】——makefile-example

代码仓库位于bitbucket,可借助TortoiseHg(GUI工具)克隆代码或者在网页中直接下载zip包。

1.复习gcc指令

一个非常简单的C文件——test.c

【test.c】

#include <stdio.h>
int main(void)
{
    int a = 3;
    int b = 2;

    printf("a=%d\n",a);
    printf("b=%d\n",b);
    return 0;
}

【最简单方法】

gcc test.c -o test

最终生成可执行文件test。

【执行test】

./test

【输出结果】

a=3

b=5

【不正确的写法】

请注意以下写法并不正确。

gcc -c test.c -o test

【详细步骤分解】编译——链接

无论gcc指令的参数如何变化,从源文件变为可执行文件只需要两步,第一步源文件编译为目标文件,第二步从目标文件链接为可执行文件。在最简单的指令——gcc
test.c -o test中使用了一处GCC的隐含规则,所有编译和链接这两个关键步骤展现的不明显。那么下面通过指令让“不明显”变得“明显”。

【1】由c文件编译为目标文件

【写法1】

gcc -c test.c -o test.o

【写法2】——顺序可以颠倒

gcc -o test.o -c test.c

【写法3】——适当简写

可以适当简写,充分利用GCC的默认规则,*.o文件由同名的*.c文件编译得到。

gcc -c test.c

【写法4】——有点奇怪

还可以这样写,虽然看起来有点奇怪,但只执行结果却是一样的。makefile文件似乎更喜欢这种方式。

gcc -c -o test.o test.c

【2】把目标文件链接为可执行文件

【写法1】

gcc test.o -o test

【写法2】——顺序可以颠倒

顺序可以颠倒,makefile文件似乎更喜欢这种方式。

gcc -o test test.o

2.编写makefile文件

【makefile】

请替换其中的[tab],并以代码仓库中的makefile文件为主。

# 可执行文件
TARGET = test
# 依赖目标
OBJS = test.o

# 指令编译器和选项
CC=gcc
CFLAGS=-Wall -std=gnu99

$(TARGET):$(OBJS)
# @echo TARGET:[email protected]
# @echo OBJECTS:$^
 [tab]$(CC) -o [email protected] $^

clean:
 [tab]rm -rf $(TARGET) $(OBJS)

【具体说明】

【1】TARGET=test test为最后可执行文件,linux中的可执行文件就是windows中的exe文件

【2】OBJS = test.o test.o对应test.c,利用makefile的隐含规则,test.o由test.c编译得到。

【3】CC=gcc 指定编译器为gcc

【4】CFLAGS=-Wall -std=gnu99 使能所有警告,指定编译器标准为gnu99

【5】 $(CC) -o [email protected] $^

[email protected]和$^为自动化变量,[email protected]指目标文件,此处为可执行文件test,$^指去除重复的依赖文件,此处为test.o

$(CC) -o [email protected] $^ 最终变化为 gcc -o test test.o。gcc -o test test.o和【详细步骤】链接部分的指令完全相同。那么makefile和gcc指令便建立了联系。

可以通过@echo指令在makefile执行过程中打印自动化变量,通过这种方式调试makefile加速错误修正。

【编译】

make clean && make

先执行make clean再执行make生成可执行文件

【控制台输出】

gcc -Wall -std=gnu99 -c -o test.o test.c

gcc -o test test.o

【分析】

若去除-Wall -std=gnu99,那么以上两句简化为

gcc -c -o test.o test.c 和编译过程方法【4】相同

gcc -o test test.o       和执行过程方法【2】相同

那么makefile和gcc指令便建立了关系,理解起来也方便多了。

3.再完善一些

【makefile】

请替换其中的[tab],并以代码仓库中的makefile文件为主

# 可执行文件
TARGET=test
# C文件
SRCS = test.c
# 目标文件
OBJS = $(SRCS:.c=.o)

# 指令编译器和选项
CC=gcc
CFLAGS=-Wall -std=gnu99

$(TARGET):$(OBJS)
#	@echo TARGET:[email protected]
#	@echo OBJECTS:$^
 [tab]$(CC) -o [email protected] $^

clean:
 [tab]rm -rf $(TARGET) $(OBJS)

%.o:%.c
 [tab]$(CC) $(CFLAGS) -o [email protected] -c $<

【变化说明】

【1】OBJS = $(SRCS:.c=.o) 此处并没有使用GCC的默认规则而重新制定了规则,为以后加入头文件查找路径做准备。

【2】$<为自动化变量,指第一个目标文件,此处为test.c

替换变量和自动化变量之后:

test.o:test.c

[tab]gcc -Wall -std=gnu99 -o test.o -c test.c

4.总结

【1】gcc指令执行顺序——先编译目标文件,后链接成可执行文件

【2】自动化变量

[email protected] 当前规则的目标文件

$< 第一个依赖文件

$^ 去除重复的所有依赖文件

Linux学习笔记——例说makefile 单个C文件

时间: 2024-10-26 15:01:12

Linux学习笔记——例说makefile 单个C文件的相关文章

Linux学习笔记——例说makefile 多个文件

0.前言 从学习C语言开始就慢慢开始接触makefile,查阅了很多的makefile的资料但总感觉没有真正掌握makefile,如果自己动手写一个makefile总觉得非常吃力.所以特意借助博客总结makefile的相关知识,通过例子说明makefile的具体用法. 例说makefile大致分为4个部分 1.只有单个C文件 2.含有多个C文件 3.需要包括头文件路径 4.一个较为复杂的例子 [代码仓库]--makefile-example 代码仓库位于bitbucket,可借助Tortoise

Linux学习笔记——例说makefile 增加系统共享库

0.前言 从学习C语言开始就慢慢开始接触makefile,查阅了很多的makefile的资料但总感觉没有真正掌握makefile,如果自己动手写一个makefile总觉得非常吃力.所以特意借助博客总结makefile的相关知识,通过例子说明makefile的具体用法. 例说makefile大致分为4个部分 1.只有单个C文件 2.含有多个C文件 3.需要包括头文件路径 4.增加宏定义 5.增加系统共享库 6.增加自定义共享库 7.一个实际的例子 [代码仓库]--makefile-example

Linux学习笔记——例说makefile 头文件查找路径

0.前言 从学习C语言开始就慢慢开始接触makefile,查阅了很多的makefile的资料但总感觉没有真正掌握makefile,如果自己动手写一个makefile总觉得非常吃力.所以特意借助博客总结makefile的相关知识,通过例子说明makefile的具体用法. 例说makefile大致分为4个部分 1.只有单个C文件 2.含有多个C文件 3.需要包括头文件路径 4.一个较为复杂的例子 [代码仓库]--makefile-example 代码仓库位于bitbucket,可借助Tortoise

Linux学习笔记——例说makefile 增加自定义共享库

0.前言 从学习C语言开始就慢慢开始接触makefile,查阅了很多的makefile的资料但总感觉没有真正掌握makefile,如果自己动手写一个makefile总觉得非常吃力.所以特意借助博客总结makefile的相关知识,通过例子说明makefile的具体用法. 例说makefile大致分为4个部分 1.只有单个C文件 2.含有多个C文件 3.需要包括头文件路径 4.增加宏定义 5.增加系统共享库 6.增加自定义共享库 7.一个实际的例子 [代码仓库]--makefile-example

Linux学习笔记——例说makefile 综合案例

0.前言 从学习C语言开始就慢慢开始接触makefile,查阅了很多的makefile的资料但总感觉没有真正掌握makefile,如果自己动手写一个makefile总觉得非常吃力.所以特意借助博客总结makefile的相关知识,通过例子说明makefile的具体用法. 例说makefile大致分为4个部分 1.只有单个C文件 2.含有多个C文件 3.需要包括头文件路径 4.一个较为复杂的例子 [代码仓库]--makefile-example 代码仓库位于bitbucket,可借助Tortoise

Linux学习笔记——例说makefile 增加宏定义

0.前言 从学习C语言开始就慢慢开始接触makefile,查阅了很多的makefile的资料但总感觉没有真正掌握makefile,如果自己动手写一个makefile总觉得非常吃力.所以特意借助博客总结makefile的相关知识,通过例子说明makefile的具体用法. 例说makefile大致分为4个部分 1.只有单个C文件 2.含有多个C文件 3.需要包括头文件路径 4.增加宏定义 5.增加系统共享库 6.增加自定义共享库 7.一个实际的例子 [代码仓库]--makefile-example

Linux学习笔记——例说makefile 索引博文

0.前言 从学习C语言开始就慢慢开始接触makefile,查阅了很多的makefile的资料但总感觉没有真正掌握makefile,如果自己动手写一个makefile总觉得非常吃力.所以特意借助博客总结makefile的相关知识,通过例子说明makefile的具体用法. 博文试图从简到难,通过例子说明makefile的写法,而不是整段或整片的抄袭网络上的文章. 1.索引 1.只有单个C文件 2.含有多个C文件 3.需要包括头文件路径 4.增加宏定义 5.增加系统共享库 6.增加自定义共享库 7.一

[转]Linux学习笔记——例说makefile 头文件查找路径

0.前言 从学习C语言开始就慢慢开始接触makefile,查阅了很多的makefile的资料但总感觉没有真正掌握makefile,如果自己动手写一个makefile总觉得非常吃力.所以特意借助博客总结makefile的相关知识,通过例子说明makefile的具体用法. 例说makefile分为以下几个部分,更多内容请参考[例说makefile索引博文] 1.只有单个C文件 2.含有多个C文件 3.需要包括头文件路径 4.增加宏定义 5.增加系统共享库 6.增加自定义共享库 7.一个实际的例子 [

Linux学习笔记——如何使用echo指令向文件写入内容

0.前言 本文总结如何使用echo命令向文件中写入内容,例如使用echo指令覆盖文件内容,使用echo指令向文件追加内容,使用echo指令往文件中追加制表符. echo向文件中输出内容的基本方法是使用IO重定向指令--">",默认情况下echo输出到标准输出中,使用>指令可重定向输出到文件中. 1.echo指令基本用法 [1]Linux官方用户手册--echo指令 [2]输入指令获得帮助 sudo echo --help 返回内容如下 用法:echo [短选项]... [字