makefile交叉编译helloworld makefile交叉编译helloworld主要需要修改的是在本地编译helloworld基础上修改本地⼯具链为交叉编译⼯具链。
1.本地使⽤makefile编译helloworld
如图为⼯程⽬录结构
.
├── hello.c
├── hello.h
├── main.c
├── Makefile
├── world.c
└── world.h
hello.c⽂件
#include<stdio.h>
#include"hello.h"
void hello()
{
printf("hello");
}
world.c⽂件
#include<stdio.h>
#include"world.h"
void world()
{
printf("world");
}
main.c
#include<stdio.h>
#include"hello.h"
#include"world.h"
int main()
{
//printf("hello world\n");
hello();
world();
return0;
}
那么如何写MakeFile⽂件编译以上⼯程呢?
1.1简单的makefile⽂件如下
OBJS = main.o hello.o world.o
CC = gcc
CFLAGS =-Wall -O -g
helloworld : $(OBJS)
$(CC) $(OBJS)-o helloworld
main.o : main.c
$(CC) $(CFLAGS)-c main.c -o main.o
hello.o : hello.c hello.h
$(CC) $(CFLAGS)-c hello.c -o hello.o
world.o : world.c world.h
$(CC) $(CFLAGS)-c world.c -o world.o
clean:
rm -rf *.o helloworld
注意,如果报下⾯的错误
Makefile:17: *** missing separator. Stop
可能是Makefile格式不正确,注意要⽤tab,⽽不是空格键,Makefile有以下规则
A: B
(tab)<command>
(tab)<command>
1.2优化的makefile⽂件如下
主要的优化点为不⽤⼿动⼀个⼀个⽂件名写。
CC = gcc
LD = gcc
# 正则表达式表⽰⽬录下所有.c⽂件,相当于:SRCS = main.c a.c b.c
SRCS =$(wildcard *.c)
# OBJS表⽰SRCS中把列表中的.c全部替换为.o,相当于:OBJS = main.o a.o b.o
OBJS =$(patsubst %c, %o, $(SRCS))
# 可执⾏⽂件的名字
TARGET = helloworld
# .PHONE伪⽬标,具体含义百度⼀下⼀⼤堆介绍
.PHONY:all clean
# 要⽣成的⽬标⽂件
all: $(TARGET)
# 第⼀⾏依赖关系:冒号后⾯为依赖的⽂件,相当于Hello: main.o a.o b.o
# 第⼆⾏规则:$@表⽰⽬标⽂件,$^表⽰所有依赖⽂件,$<;表⽰第⼀个依赖⽂件$(TARGET):$(OBJS)
$(LD) -o $@ $^
# 上⼀句⽬标⽂件依赖⼀⼤堆.o⽂件,这句表⽰所有.o都由相应名字的.c⽂件⾃动⽣成
%.o:%.c
$(CC) -c $^
# make clean删除所有.o和⽬标⽂件
clean:
rm -f $(OBJS)$(TARGET)
函数1:wildcard
产⽣⼀个所有以’.c’ 结尾的⽂件的列表。
SOURCES = $(wildcard *.c *.cpp)表⽰产⽣⼀个所有以.c,.cpp结尾的⽂件的列表,然后存⼊变量SOURCES ⾥。
函数2:patsubst
匹配替换,有三个参数。第⼀个是⼀个需要匹配的式样,第⼆个表⽰⽤什么来替换它,第三个是⼀个需要被处理的由空格分隔的列表。OBJS =$(patsubst %.c,%.o,$(patsubst %.cc,%.o,$(SOURCES)))
表⽰把⽂件列表中所有的.c,.cpp字符变成.o,形成⼀个新的⽂件列表,然后存⼊OBJS变量中。
2.makefile交叉编译helloworld
对于以上⼯程,需要交叉编译的时候主要需要修改c/c++编译⼯具链,以及设置环境变量使能够到交
叉编译⼯具链。
(1)修改c/c++编译⼯具链如下
CROSS_COMPILE ?= arm-linux-gnueabihf-
CC :=$(CROSS_COMPILE)gcc
LD :=$(CROSS_COMPILE)ld
(2)设置环境变量,到交叉编译⼯具链的路径
在控制台输⼊
export PATH=$PATH:$HOME/raspberrypi/tools/arm-bcm2708/arm-linux-gnueabihf/bin
交叉编译能够成功。
交叉编译的makefile如下
CROSS_COMPILE ?= arm-linux-gnueabihf-
CC :=$(CROSS_COMPILE)gcc
LD :=$(CROSS_COMPILE)ld
CFLAGS = -Wall -O -g
OBJS = main.o hello.o world.o
helloworld :$(OBJS)
$(CC)$(OBJS) -o helloworld
main.o : main.c
$(CC)$(CFLAGS) -c main.c -o main.o
hello.o : hello.c hello.h
$(CC)$(CFLAGS) -c hello.c -o hello.o
world.o : world.c world.h
$(CC)$(CFLAGS) -c world.c -o world.o
makefile phonyclean:
rm -rf *.o helloworld
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论