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

超级管理员

453

帖子

1378

回复

3116

积分

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

Makefile是用来管理工程的。

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



超级管理员

453

帖子

1378

回复

3116

积分
14#
发表于 2020-10-16 16:44:48

image.png

先把.s和.c后缀的文件多编译成.o后缀的文件, 再执行上面的程序流程

超级管理员

453

帖子

1378

回复

3116

积分
13#
发表于 2020-10-16 16:42:34

arm-linux-ld链接工具介绍


arm-linux-ld是一个链接程序工具,其作用主要是将汇编过的多个二进制文件进行链接,成为一个可执行的二进制文件,这个命令的选项有好多,具体用到的时候大家可以使用--help 选项来查看具体的选项用法。

选项用法选项用法:

下面将几个重要的命令介绍一下:
-T File     --script FILE指定一个链接器脚本文件,指示编译器按照脚本进行链接;
-Tbss ADDRESS    bss段的链接地址;
-Ttext ADDRESS   代码段链接地址;
-Tdata ADDRESS  数据段链接地址;
-r --relocateable 产生可重定向的输出,比如,产生一个输出文件它可再次作为‘ld'的输入,这经常被叫做“部分链接”,当我们需要将几个小的.o文件链接成为一个.o文件的时候,需要使用此选项。
-e  指定程序的入口标号;
-l   LibName 指定要链接的库;
-L  Directory 增加库文件的搜索路径;
-o  FILE 设置输出文件名;
-O  输出文件最优;

-a  指定arch体系;

例如:

arm-linux-ld -Ttext 0x10000000 main.o -o main_elf

这句话是将main.o 文件连接成ELF格式文件,在连接的过程中,-Ttext 0x10000000这个选项告诉连接器我的这段main.o程序需要被加载到RAM的0x10000000地址处执行。所以在连接的时候main.o第一条语句的连接地址就是0x10000000,第二条语句就是跟在其后面。有很多人都议论连接地址和运行地址这个怎么说的都有。运行地址可以等于连接地址,还可以认为运行地址是pc指针指向的地址,就是正在执行指令的地址。只要理解了这个概念就可以了。

arm-linux-objdump

一.arm-linux-objdump常用来显示二进制文件信息,常用来查看反汇编代码
二.常用选项:
1.-b bfdname 指定目标码格式
2.—disassemble或者-d 反汇编可执行段
3.—dissassemble-all或者-D 反汇编所有段
4.-EB,-EL指定字节序
5.—file-headers或者-f 显示文件的整体头部摘要信息
6.—section-headers,--headers或者-h 显示目标文件中各个段的头部摘要信息
7.—info 或者-I 显示支持的目标文件格式和CPU架构
8.—section=name或者-j name显示指定section 的信息
9.—architecture=machine或者-m machine 指定反汇编目标文件时使用的架构

三.示例

Arm-linux-objdump –D elf_file > dis_file 
#或者
Arm-linux-objdump –D –b binary –m arm bin_file > dis_file



arm-linux-objcopy

一、概述:

    arm-linux-objcopy被用来复制一个目标文件的内容到另一个文件中.此选项可以进行格式的转换.在实际编程的,用的最多的就是

将ELF格式的可执行文件转换为二进制文件.

    如:

    Arm-linux-objcopy –o binary –S elf_file bin_file

   二、常用选项:

       1.input-file、outfile

        输入输出文件.如果没有outfile,则输出文件名为输入文件名.

        2.-l bfdname或—input-target=bfdname

        用来指明源文件的格式,bfdname是BFD库中描述的标准格式名,如果没指明,则arm-linux-objcopy自己分析.

3.-O bfdname

输出的格式.

4.-F bfdname

同时指明源文件,目的文件的格式.

5.-R sectionname

从输出文件中删除掉所有名为sectionname的段.

6.-S

不从源文件中复制重定位信息和符号信息到目标文件中.

7.-g

不从源文件中复制调试符号到目标文件中.



超级管理员

453

帖子

1378

回复

3116

积分
12#
发表于 2020-10-16 16:24:28

glibc读写文件接口

linux中要读取一个文件,可以使用fopen打开文件,fread读取文件,读完之后fclose关闭文件。

要写文件用fwrite来写。这些函数是glibc的库函数,在linux中用man 3 可以查找。

如果你本身就知道这些函数的用法,只是记不起来可以man查找;如果你本身根本就不会用这些接口,建议先去baidu。

image.png

image.png

超级管理员

453

帖子

1378

回复

3116

积分
11#
发表于 2020-10-16 14:05:26

如果make文件或命令没有更改,那么make时提示是最新的 无需更新

反之会自动执行 没有提示

vi b.c

int i=100;

image.png

超级管理员

453

帖子

1378

回复

3116

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

image.png

找不到 hello 这个目标 停止 make

超级管理员

453

帖子

1378

回复

3116

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

image.png

image.png

超级管理员

453

帖子

1378

回复

3116

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

标准写法:

image.png

超级管理员

453

帖子

1378

回复

3116

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

超级管理员

453

帖子

1378

回复

3116

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

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

image.png

image.png

超级管理员

453

帖子

1378

回复

3116

积分
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

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

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

欢迎光临昆山中宇工控PLC论坛!您是第 10334485 位访问者, 日访问量: 284 总访问量: 22667155,当前 2024-11-24 00:15:48 在线人数:68

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