PLC解密网-PLC培训学习-工控自动化人才技术交流

超级管理员

195

帖子

742

回复

1375

积分

楼主
发表于 2020-10-16 10:15:14 | 查看: 63 | 回复: 14

Makefile是用来管理工程的。

在一个正式的软件项目中,由很多个.c和.h文件构成,此时如果直接在命令行编译,就会像这样:gcc a.c b.c c.c d.c e.c f.c g.c -o exe 每次编译都要输入一堆东西很麻烦,这个问题严重影响工作效率,怎么办?Makefile来解决



超级管理员

195

帖子

742

回复

1375

积分
沙发
发表于 2020-10-16 10:18:22

一个简单的Makefile示例

n arm-none-linux-gnueabi-addr2line -s arm-linux-addr2line

ln arm-none-linux-gnueabi-ar -s arm-linux-ar

ln arm-none-linux-gnueabi-as -s arm-linux-as

ln arm-none-linux-gnueabi-c++ -s arm-linux-c++

ln arm-none-linux-gnueabi-c++filt -s arm-linux-c++filt

ln arm-none-linux-gnueabi-cpp -s arm-linux-cpp

ln arm-none-linux-gnueabi-g++ -s arm-linux-g++

ln arm-none-linux-gnueabi-gcc -s arm-linux-gcc

ln arm-none-linux-gnueabi-gcc-4.4.1 -s arm-linux-gcc-4.4.1

ln arm-none-linux-gnueabi-gcov -s arm-linux-gcov

ln arm-none-linux-gnueabi-gdb -s arm-linux-gdb

ln arm-none-linux-gnueabi-gdbtui -s arm-linux-gdbtui

ln arm-none-linux-gnueabi-gprof -s arm-linux-gprof

ln arm-none-linux-gnueabi-ld -s arm-linux-ld

ln arm-none-linux-gnueabi-nm -s arm-linux-nm

ln arm-none-linux-gnueabi-objcopy -s arm-linux-objcopy

ln arm-none-linux-gnueabi-objdump -s arm-linux-objdump

ln arm-none-linux-gnueabi-ranlib -s arm-linux-ranlib

ln arm-none-linux-gnueabi-readelf -s arm-linux-readelf

ln arm-none-linux-gnueabi-size -s arm-linux-size

ln arm-none-linux-gnueabi-sprite -s arm-linux-sprite

ln arm-none-linux-gnueabi-strings -s arm-linux-strings

ln arm-none-linux-gnueabi-strip -s arm-linux-strip

Makefile中的一些基本概念

目标:目标定格写,后面是冒号(冒号后面是依赖)

依赖:依赖是用来产生目标的原材料。

命令:命令前面一定是Tab,不能是定格,也不能说多个空格。命令就是要生成那个目标需要做的动作。

Makefile的基本工作原理

其一,当我们执行 make xx 的时候,Makefile会自动执行xx这个目标下面的命令语句。

其二,当我们make xx的时候,是否执行命令是取决于依赖的。依赖如果成立就会执行命令,否则不执行。

其三,我们直接执行make 和make 第一个目标  效果是一样的。(第一个目标其实就是默认目标)

进一步学习Makefile的资料

我们学习Makefile的思路就是:先学会基本的概念和应用,先理解Makefile的概念和使用方法、工作原理。先自己会写简单的Makefile来管理工程。一般先学到这里就可以了,更深入的内容可以随同稍后的课程一起来学习,我们讲到课程的时候会再次提及并且逐步深入。

对于我们有一定基础的同学,同时还有时间,可以深入学习Makefile,看《跟我一起学Makefile》(作者:陈皓)

跟我一起学makefile.pdf


超级管理员

195

帖子

742

回复

1375

积分
板凳
发表于 2020-10-16 10:27:06

mk-arm-linux-.zip解压后得到 mk-arm-linux-.sh 文件

先在Windows系统把makefile文件 mk-arm-linux-.sh 复制到linux共享目录,然后到linux系统复制

cp /mnt/hgfs/winshare/mk-arm-linux-.sh ./ 并执行这个脚本

image.png


超级管理员

195

帖子

742

回复

1375

积分
地板
发表于 2020-10-16 10:42:22

为了解决windows系统和linux系统回车不一样的问题,可以这样建脚本:

在Windows打开 文件并复制

image.png

新建 a.sh 并打开后粘贴,保存退出,最后执行a.sh脚本文件 

vi a.sh

image.png

执行这个脚本: sourse a.sh 就行了

超级管理员

195

帖子

742

回复

1375

积分
4#
发表于 2020-10-16 11:02:14

Linux脚本开头#!/bin/bash和#!/bin/sh是什么意思以及区别

一、意思

#!/bin/sh是指此脚本使用/bin/sh来解释执行,#!是特殊的表示符,其后面根的是此解释此脚本的shell的路径。

其实第一句的#!是对脚本的解释器程序路径,脚本的内容是由解释器解释的,我们可以用各种各样的解释器来写对应的脚本。

比如说/bin/csh脚本,/bin/perl脚本,/bin/awk脚本,/bin/sed脚本,甚至/bin/echo等等。

#!/bin/bash同理。

二、区别

GNU/Linux操作系统中的/bin/sh本是bash (Bourne-Again Shell) 的符号链接,但鉴于bash过于复杂,有人把bash从NetBSD移植到Linux并更名为dash (Debian Almquist Shell),并建议将/bin/sh指向它,以获得更快的脚本执行速度。Dash Shell 比Bash Shell小的多,符合POSIX标准。

Ubuntu继承了Debian,所以从Ubuntu 6.10开始默认是Dash Shell。

image.png

应该说,/bin/sh/bin/bash虽然大体上没什么区别,但仍存在不同的标准。标记为#!/bin/sh的脚本不应使用任何POSIX没有规定的特性 (如let等命令, 但#!/bin/bash可以)。Debian曾经采用/bin/bash更改/bin/dash,目的使用更少的磁盘空间、提供较少的功能、获取更快的速度。但是后来经过shell脚本测试存在运行问题。因为原先在bash shell下可以运行的shell script (shell 脚本),在/bin/sh下还是会出现一些意想不到的问题,不是100%的兼用。

上面可以这样理解,使用man sh命令和man bash命令去观察,可以发现sh本身就是dash,也就更好的说明集成Debian系统之后的更改。

image.png

超级管理员

195

帖子

742

回复

1375

积分
5#
发表于 2020-10-16 13:02:37

简单的Makefile示例

先创建 a.c b.c两个文件

a.c

#include <stdio.h>

extern int i;

int main(void)

{

        printf("hello word. i = %d.\n", i);

        return 0;

}

b.c

int i=10;

没有makefile 这样用

gcc a.c b.c -o exe 生成 exe文件后执行 ./exe 效果如下:

image.png

下面创建 Makefile文件的方式实现:

touch Makefile创建Makefile文件并编辑:

image.png

最后make看效果

image.png

超级管理员

195

帖子

742

回复

1375

积分
6#
发表于 2020-10-16 13:26:48

也可以把linux系统生成的Makefile文件移动到windows系统的共享目录:
cp Makefile /mnt/hgfs/winshare/Makefile1.sh

image.png

image.png

超级管理员

195

帖子

742

回复

1375

积分
7#
发表于 2020-10-16 13:41:45
提示: 该作者的回复内容被删除屏蔽

超级管理员

195

帖子

742

回复

1375

积分
8#
发表于 2020-10-16 13:44:22

标准写法:

image.png

超级管理员

195

帖子

742

回复

1375

积分
9#
发表于 2020-10-16 13:55:04

image.png

image.png

超级管理员

195

帖子

742

回复

1375

积分
10#
发表于 2020-10-16 13:58:32

image.png

找不到 hello 这个目标 停止 make

您需要登录后才可以回帖 登录 | 立即注册

技术支持 KZYPLC V2.1 © 2020-2027

欢迎光临昆山中宇工控PLC论坛!您是第 260252 位访问者, 日访问量: 5055 总访问量: 1367478,当前 2020-10-23 16:13:56 在线人数:33

ICP备案证书号: 苏ICP备14003016-2号