Linux下的Makefile初入

在Windows下的开发环境中用集成的IDE编辑器的话,会经历编写、编译、下载/执行,而在Linux下没有这些,这就需要我们自己来进行创造。

Makefile的作用就是对代码进行编译,我们在进行一个已经写好的代码进行编译的时候回执行如下指令

1 gcc a.c -o a.out

这样做的话一个文件少没问题,而一旦文件多达上百个的时候,我们不可能还要一个一个的敲,这时候就需要使用Makefile

NAME    := led                       #工程名字
OBJ     := a.o b.o start.o           #链接文件名

ARM     := arm-linux-gnueabihf-      #编译语句
GCC     := $(ARM)gcc                 #编译文件
LD      := $(ARM)ld                  #链接文件
OBJCOPY := $(ARM)objcopy             #编译为bin文件
OBJDUMP := $(ARM)objdump             #反编译为汇编文件

$(NAME).bin:&(OBJ)
    $(LD) -Ttest 0x87800000 $^ -o $(NAME).lef
    $(OBJCOPY) -O binary -S $(NAME).lef [email protected]
    $(OBJDUMP) -D -m arm $(NAME).lef > $(NAME).dis

%.o:%.s
    $(GCC) -Wall -nostdlib -c -O2 -o [email protected] $<

%.o:%.S
    $(GCC) -Wall -nostdlib -c -O2 -o [email protected] $<

%.o:%.c
    $(GCC) -Wall -nostdlib -c -O2 -o [email protected] $<

clean:
    rm -rf *.0 *.lef *dis

在makefile中,可以像C语言中定义变量 NAME、OBJ、ARM、GCC、LD、OBJCOPY、OBJDUMP 就为变量 而$( NAME)则使用变量 如

ARM     := arm-linux-gnueabihf-      #编译语句
GCC     := $(ARM)gcc                 #编译文件

#等效于

arm-linux-gnueabihf-gcc

%.c %.o %.s 为通配符,表示文件下所有.c .o .s文件

%.o:%.c 等效于 a.o:a.c,表示.o文件依赖于.c文件,原理是如果.c文件的时间比.o文件的时间新,则执行

a.o:a.c  $(GCC) -Wall -nostdlib -c -O2 -o [email protected] $<
等效于
arm-linux-gnueabihf-gcc -Wall -nostdlib -c -O2 -o a.o a.c

链接所有.o文件  0x87800000为代码起始地址

$(LD) -Ttest 0x87800000 $^ -o $(NAME).lef  
等效于
arm-linux-gnueabihf-ld -Ttest 0x87800000 a.o -o a.lef

把.lef文件编译为bin文件

$(OBJCOPY) -O binary -S $(NAME).lef [email protected]
等效于
arm-linux-gnueabihf-objcopy -O binary -S a.lef a.bin

反汇编,把bin文件编译为.dis 汇编文件

$(OBJDUMP) -D -m arm $(NAME).lef > $(NAME).dis等效于
arm-linux-gnueabihf-objump -D -m arm a.lef > a.dis

根据我自己所理解的程度编译的,可能不详细,见谅

原文地址:https://www.cnblogs.com/puchi/p/11813188.html

时间: 2024-11-10 15:20:31

Linux下的Makefile初入的相关文章

Linux下编写 makefile 详细教程

原文地址:https://www.cnblogs.com/mfryf/p/3305778.html 还有一篇也不错:http://wiki.ubuntu.org.cn/跟我一起写Makefile:MakeFile介绍 近期在学习Linux下的C编程,买了一本叫<Linux环境下的C编程指南>读到makefile就越看越迷糊,可能是我的理解能不行. 于是google到了以下这篇文章.通俗易懂.然后把它贴出来,方便学习. 后记,看完发现这篇文章和<Linux环境下的C编程指南>的mak

Linux下的makefile的妙用dd

一:起因 (0)首先我们假设读者已经熟悉了Linux 下的vim的常用操作(如,u 撤消 或  :undo   CTRL-R 重做 或  :redo): (1)Linux下面的make命令,应用与makefile文件,当我们需要对一个C / C++ 或者Java等一个工程里面的所有源文件进行编译时,每一次编译,都不想重复操作以前的命令,更不想把未更改过的源文件再次进行不必要的编译操作 -- 最佳选择makefile(PS:虽然这时,你可以选择写一个shell,但是shell需要太多的代码了,好多

实例讲解Linux下的makefile

1.程序代码结构如下 makefile/ |-- Makefile |-- haha.c `-- hehe.c 1.1.需要被编译的源代码如下 $ cat haha.c #include "stdio.h" int main() { printf("ha ! ha !\n"); return 0; } $ cat hehe.c #include "stdio.h" int main() { printf("he ~ he ~\n&quo

windows通过linux下的openvpn登入远程服务器内网

需求:在某些网络要求比较严格的环境中,我们在异地无法远程访问公司内网,给我们的工作带来了极大的不便:但是通过openvpn我们可以轻松实现,下面就来介绍下. 1.网络环境: 公司openvpn服务器(linux):wan 75.126.207.84 lan 10.61.53.84 本地服务器(windows): wan 115.238.239.132 lan 10.10.1.132 2.所需安装软件: openvpn版本:openvpn-2.2.2.tar.gz (linux,可以到http:/

linux下查看用户登入系统相关命令及编写脚本(七)

查看用户登入系统日志 1.w 显示谁登入并正在做什么事 2.who 显示谁登入 -r:显示系统运行级别 3.sleep 睡眠命令(sleep 5 睡眠5秒后醒来) 4.whoami 显示用户名或UID 5.last:显示/var/log/wtmp文件,显示用户登录历史及系统重启历史 -n 3: 显示最近3次的相关信息 6.lastb:显示/var/log/btmp文件,显示用户错误的登录尝试 -n 3: 显示最近3次的错误的登录尝试 7.lastlog: 显示每一个用户最近一次的成功登录信息:

在linux下编译openjdk7

最近刚开始看<深入理解JAVA虚拟机>这本书.第一章的实践是自己手动编译openjdk7,但书上的步骤都是基于windows的,于是在网上搜了一下linux下编译openjdk的资料: http://blog.csdn.net/kindazrael/article/details/7266314 http://guoh.org/lifelog/2011/05/compile-openjdk-by-yourself/ 这辆篇文章都说的比较详细.其实,最好的文档是openjdk源码包中的READM

linux下gcc编译多个源文件、gdb的使用方法(转)

原文 http://www.cnblogs.com/jiu0821/p/4483804.html 一. gcc常用编译命令选项 假设源程序文件名为test.c. 1. 无选项编译链接 用法:#gcc test.c 作用:将test.c预处理.汇编.编译并链接形成可执行文件.这里未指定输出文件,默认输出为a.out. 2. 选项 -o 用法:#gcc test.c -o test 作用:将test.c预处理.汇编.编译并链接形成可执行文件test.-o选项用来指定输出文件的文件名. 3. 选项 -

linux下gcc编译多个源文件、gdb的使用方法

一. gcc常用编译命令选项 假设源程序文件名为test.c. 1. 无选项编译链接 用法:#gcc test.c 作用:将test.c预处理.汇编.编译并链接形成可执行文件.这里未指定输出文件,默认输出为a.out. 2. 选项 -o 用法:#gcc test.c -o test 作用:将test.c预处理.汇编.编译并链接形成可执行文件test.-o选项用来指定输出文件的文件名. 3. 选项 -E 用法:#gcc -E test.c -o test.i 作用:将test.c预处理输出test

Linux下python玩转MySQLdb

(0)目录 VMware 下安装Ubuntu的吐血经历 零基础学习Shell编程 Linux下的makefile的妙用 Linux调试神器 -- gdb 十分钟学会Python的基本类型 分布式版本管理神器--GIT GIT文件的三种状态 & Git SSH秘钥问题 十分钟学习Python的进阶语法 配置SSH无密码访问及Linux热键.重启.kill进程 Java的不定长参数和Python的不定长参数对比 Linux下python玩转MySQLdb 一:起因 (1)Linux下安装python