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();return 0;
}
那么如何写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 clean: rm -rf *.o helloworld
参考文献
https://www.cnblogs.com/mfryf/p/4613504.html
https://blog.csdn.net/shaosunrise/article/details/79968921
makefile交叉编译helloworld相关推荐
- 手机linux编译器,在linux上交叉编译helloWorld到android手机上去
在ubuntu上交叉编译helloWorld到arm64的android手机上去. 这里NDK用的是r19及以上的版本. 1. 安装NDK 这里下载了 android-ndk-r21b,解压到 /ho ...
- makefile编写helloworld
相信在unix下编程的没有不知道makefile的,刚开始学习unix平台 下的东西,了解了下makefile的制作,觉得有点东西可以记录下. 下面是一个极其简单的例子: 现在我要编译一个Hello ...
- ubuntu makefile交叉编译报错:file not recognized: file format not recognized
在linux ubuntu上编译netkit-ftp的时候报错:file not recognized: file format not recognized [root@ubuntu /arnold ...
- Makefile入门一、helloworld
Makefile入门一.helloworld 1.了解gcc从源码到可执行文件的步骤 2.Makefile的helloworld 3.提到Makefile不得不了解gcc命令 1.了解gcc从源码到可 ...
- Linux平台Makefile文件的编写基础篇和GCC参数详解
问:gcc中的-I.是什么意思....看到了有的是gcc -I. -I/usr/xxxxx..那个-I.是什么意思呢 最佳答案 答:-Ixxx 的意思是除了默认的头文件搜索路径(比如/usr/incl ...
- android 能调用gcc_Android:交叉编译总结
总结一下交叉编译 如何用交叉编译链命令行编译 基本通过下面两句可以完成helloworld编译,参考(本方法已经过时了,请不要使用,要使用独立编译链的方法)https://www.cnblogs.co ...
- linux C编程之makefile
linux C编程之makefile 目的: 基本掌握了 make 的用法,能在Linux系统上编程. 环境: Linux系统,或者有一台Linux服务器,通过终端连接.一句话 ...
- 【转】makefile写法2
转自: 目的: 基本掌握了make的用法,能在Linux系统上编程. 环境: Linux系统,或者有一台Linux服务器,通过终端连接.一句话:有Linux编译环境. 准备: ...
- WINCE的FFMPEG交叉编译环境搭建
1.下载MinGW,cygwin两个WINCE的MAKEFILE交叉编译工具,并安装到D盘根目录下. 2.配置用户环境变量,新建path目录,并将值设为如下: C:\cygwin\opt\mingw3 ...
最新文章
- Enterprise Library之错误处理部分
- ----------------学习进度表---------------------------------
- 卫生统计学v是什么意思_四川大学华西公共卫生学院报考常见问题答疑
- matlab打开界面模糊,如何在人机界面GUI的M文件中嵌入模糊FIS模块
- Hive----------Cannot find hadoop installation: $HADOOP_HOME m...
- 单词嵌入_神秘的文本分类:单词嵌入简介
- python编写装饰器_我也来写一下python装饰器
- 【debug】json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
- 《算法竞赛入门经典》 第二章 循环结构程序设计 习题
- OS X中的bundle
- Mars3D基础学习:地图控件
- 一阶系统开环传递函数表达式_带钢纠偏液压系统模糊PID 控制与仿真
- 有关session安全的那些事儿
- c语言的case有什么作用,c语言case的用法
- linux 查看gnu,查看GNU/Linux信息
- 使用腾讯云上传图片,并给图片加水印
- Windows Defender怎么添加排除项?
- Contrastive learning的学习
- asp.net调用51ditu
- 计算机工作区如何删除,Windows Ink工作区是什么,怎么打开/关闭Windows Ink?