设为首页
收藏本站
开启辅助访问
切换到窄版
登录
|
立即注册
搜索
搜索
热搜:
活动
交友
discuz
本版
帖子
用户
NB-IOT
Cat.1
LoRaWAN/RF/Wi-SUN
嵌入式应用
Wi-Fi
BLE
物联网应用
论坛2
Help
快捷导航
物联网开发者社区
»
论坛
›
技术讨论区
›
Wi-Fi
›
Linux学习——makefile
返回列表
查看:
1332
|
回复:
0
[技术交流]
Linux学习——makefile
[复制链接]
Wi-Fi_001
Wi-Fi_001
当前离线
积分
596
185
主题
204
帖子
596
积分
利尔达员工
积分
596
发消息
发表于 2019-3-15 09:34:24
|
显示全部楼层
|
阅读模式
一个非常简单的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
@
# @echo OBJECTS
^
[tab]$(CC) -o $@ $^
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 $@ $^
$@和$^为自动化变量,$@指目标文件,此处为可执行文件test,$^指去除重复的依赖文件,此处为test.o
$(CC) -o $@ $^ 最终变化为 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
@
# @echo OBJECTS
^
[tab]$(CC) -o $@ $^
clean:
[tab]rm -rf $(TARGET) $(OBJS)
%.o:%.c
[tab]$(CC) $(CFLAGS) -o $@ -c $<
【变化说明】
【1】OBJS = $(SRCS:.c=.o) 变量替换函数,把所有的*.c文件替换为*.o文件。该函数和
OBJS = $(patsubst %.c,%.o,$(SRCS))具有相同效果。
【2】$<为自动化变量,指第一个目标文件,此处为test.c
替换变量和自动化变量之后:
test.o:test.c
[tab]gcc -Wall -std=gnu99 -o test.o -c test.c
4.总结
【1】gcc指令执行顺序——先编译目标文件,后链接成可执行文件
【2】自动化变量
$@ 当前规则的目标文件
$< 第一个依赖文件
$^ 去除重复的所有依赖文件
---------------------
作者:xukai871105
来源:CSDN
原文:
https://blog.csdn.net/xukai871105/article/details/36475319
版权声明:本文为博主原创文章,转载请附上博文链接!
回复
使用道具
举报
返回列表
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
本版积分规则
发表回复
回帖后跳转到最后一页
浏览过的版块
BLE
行业交流
快速回复
返回顶部
返回列表