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相关推荐

  1. 手机linux编译器,在linux上交叉编译helloWorld到android手机上去

    在ubuntu上交叉编译helloWorld到arm64的android手机上去. 这里NDK用的是r19及以上的版本. 1. 安装NDK 这里下载了 android-ndk-r21b,解压到 /ho ...

  2. makefile编写helloworld

    相信在unix下编程的没有不知道makefile的,刚开始学习unix平台 下的东西,了解了下makefile的制作,觉得有点东西可以记录下. 下面是一个极其简单的例子: 现在我要编译一个Hello ...

  3. ubuntu makefile交叉编译报错:file not recognized: file format not recognized

    在linux ubuntu上编译netkit-ftp的时候报错:file not recognized: file format not recognized [root@ubuntu /arnold ...

  4. Makefile入门一、helloworld

    Makefile入门一.helloworld 1.了解gcc从源码到可执行文件的步骤 2.Makefile的helloworld 3.提到Makefile不得不了解gcc命令 1.了解gcc从源码到可 ...

  5. Linux平台Makefile文件的编写基础篇和GCC参数详解

    问:gcc中的-I.是什么意思....看到了有的是gcc -I. -I/usr/xxxxx..那个-I.是什么意思呢 最佳答案 答:-Ixxx 的意思是除了默认的头文件搜索路径(比如/usr/incl ...

  6. android 能调用gcc_Android:交叉编译总结

    总结一下交叉编译 如何用交叉编译链命令行编译 基本通过下面两句可以完成helloworld编译,参考(本方法已经过时了,请不要使用,要使用独立编译链的方法)https://www.cnblogs.co ...

  7. linux C编程之makefile

    linux C编程之makefile 目的:       基本掌握了 make 的用法,能在Linux系统上编程. 环境:       Linux系统,或者有一台Linux服务器,通过终端连接.一句话 ...

  8. 【转】makefile写法2

    转自: 目的:      基本掌握了make的用法,能在Linux系统上编程. 环境:      Linux系统,或者有一台Linux服务器,通过终端连接.一句话:有Linux编译环境. 准备:    ...

  9. WINCE的FFMPEG交叉编译环境搭建

    1.下载MinGW,cygwin两个WINCE的MAKEFILE交叉编译工具,并安装到D盘根目录下. 2.配置用户环境变量,新建path目录,并将值设为如下: C:\cygwin\opt\mingw3 ...

最新文章

  1. Enterprise Library之错误处理部分
  2. ----------------学习进度表---------------------------------
  3. 卫生统计学v是什么意思_四川大学华西公共卫生学院报考常见问题答疑
  4. matlab打开界面模糊,如何在人机界面GUI的M文件中嵌入模糊FIS模块
  5. Hive----------Cannot find hadoop installation: $HADOOP_HOME m...
  6. 单词嵌入_神秘的文本分类:单词嵌入简介
  7. python编写装饰器_我也来写一下python装饰器
  8. 【debug】json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
  9. 《算法竞赛入门经典》 第二章 循环结构程序设计 习题
  10. OS X中的bundle
  11. Mars3D基础学习:地图控件
  12. 一阶系统开环传递函数表达式_带钢纠偏液压系统模糊PID 控制与仿真
  13. 有关session安全的那些事儿
  14. c语言的case有什么作用,c语言case的用法
  15. linux 查看gnu,查看GNU/Linux信息
  16. 使用腾讯云上传图片,并给图片加水印
  17. Windows Defender怎么添加排除项?
  18. Contrastive learning的学习
  19. asp.net调用51ditu
  20. 计算机工作区如何删除,Windows Ink工作区是什么,怎么打开/关闭Windows Ink?

热门文章

  1. 4月28日,邀您参加开鸿智谷教育在鸿OS发行版发布会
  2. rust新版组队指令_新版rust指令是啥啊?
  3. IDEA插件Free Mybatis plugin
  4. 草莓棉花糖剧本-10
  5. 移动端车牌识别哪家好
  6. Windows 技术篇 - 杜比驱动安装,解决电脑渣渣音效!
  7. Spring核心技术详解
  8. 系统运维、应用运维、硬件运维之间的关系解析
  9. Lua学习简要(一)
  10. 十七.用户注册 ---- 图形验证码 2021-04-03