欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

记录学习嵌入式遇到的问题(一)手动编译链接单文件/多文件以及makefile与批处理文件的使用

程序员文章站 2022-06-08 22:07:03
...

一、手动编译连接单文件

1.编译命令

(c:\bc31\bin\)bcc -c -ml -Ic:\bc31\include -Lc:\bc31\lib test.c

2. 连接命令

(c:\bc31\bin\)tlink c:\bc31\lib\c0l.obj test.obj,test,test,c:\bc31\lib\cl.lib

(命令中的盘位置及编译的源码文件按自己需要更改)

上述命令中使用的选项为:

  • 指定将源文件编译成目标文件的选项-c;
  • 指定内存模式的选项ms、mh、-m(本书主要使用-ml);
  • 指定包含文件路径的选项-IXXX;
  • 指定库文件路径的选项- LXXXX。

二、手动编译连接多文件

用一个简单示例体会一下多文件程序的生成过程:

(1)pa程序代码
pa.c:

#include <stdio.h>
#include "pa.h"

void a_print(void)
{
printf("AAAAAAA\n");
}

pa.h:

#ifndef _PA_H_
#define _PA_H_

extern void a_print(void);

#endif

(2)pb程序代码
pb.c:

#include <stdio.h>
#include "pb.h"

void b_print(void)
{
printf("BBBBBBB\n");
}

pb.h

#ifndef _PB_H_
#define _PB_H_

extern void b_print(void);

#endif

(3)test.c程序代码
test.c:

#include "pa.h"
#include "pb.h"

void main()
{
char i=0;
do
{
a_print();
b_print();
i++;
}while(i<10);
}

(4)编译
编译pa.c以形成pa.obj文件,命令为:

(c:\bc31\bin\)bcc -c -ml -Ic:\bc31\include -Lc:\bc31\lib pa.c

(其他三个.c文件的编译命令类似,我在这里就不一一赘述了)
(5)连接成可执行文件test.exe

(c:\bc31\bin\)tlink c:\bc31\lib\c0l.obj pa.obj pb.obj test.obj,test,test,c:\bc31\lib\cl.lib

(6)运行结果
记录学习嵌入式遇到的问题(一)手动编译链接单文件/多文件以及makefile与批处理文件的使用
由此可见,当工程源文件较多时, tlink命令会很长。
BC3.1允许把连接命令的内容写入一个叫做连接文件的文本文件,这样,以后便可以通过对连接文件的引用来进行目标文件的连接工作。其命令格式为:

tlink @连接文件名

在此例中,可以改写连接命令为:

(c:\bc31\bin\)tlink c:\bc31\lib\c0l.obj pa.obj pb.obj test.obj
test
test
c:\bc31\lib\cl.lib

以命令中的逗号为换行的标志!
如果源文件更多可以使用“+”号来换行,例如:

(c:\bc31\bin\)tlink c:\bc31\lib\c0l.obj+
pa.obj+
pb.obj+
test.obj
test
test
c:\bc31\lib\cl.lib

三、管理工具make及 makefile的使用

makefile的一个程序段的格式如下:
程序标号:关联程序段标号1关联程序段标号2…
       命令集
注意:命令集中的所有命令行必须以TAB键开头。
(1)生成test.exe文件的makefile代码
makefile2:

test.exe: pa.obj pb.obj test.obj
#test.exe:
tlink c:bc31\lib\c0l.obj pa.obj pb.obj test.obj,test,test,c:\bc31\lib\cl.lib
pa.obj: pa.c pa.h
bcc -c -ml -Ic:\bc31\include -Lc:\bc31\lib pa.c
pb.obj: pb.c pb.h
bcc -c -ml -Ic:\bc31\include -Lc:\bc31\lib pb.c
test.obj: test.c
bcc -c -ml -Ic:\bc31\include -Lc:\bc31\lib test.c
clean:
del test.obj
del pa.obj
del pb.obj

makefile:

borland = c:\bc31
cc = $(borland)\bin\bcc
link = $(borland)\bin\tlink
#c_flags = -c -ml -l -n.\ -k--I$(borland)\include -L$(borland)\lib
c_flags = -c -ml -I$(borland)\include -L$(borland)\lib
link_flags = $(borland)\lib\c0l.obj
link_flags2 = $(borland)\lib\cl.lib
objects = pa.obj pb.obj test.obj
target = test
#test.exe:
test.exe:  $(objects)
#$(link) $(link_flags) @testlink
	$(link) $(link_flags) $(objects),$(target),$(target), $(link_flags2)
pa.obj:  pa.c pa.h
	$(cc) $(c_flags) pa.c
pb.obj:  pb.c pb.h
	$(cc) $(c_flags) pb.c
test.obj:  test.c
	$(cc) $(c_flags) test.c
clean:
	del test.obj
	del pa.obj
	del pb.obj

(2)执行make的命令

>make

默认是执行的makefile文件
如果需要执行其他命名的makefile文件,如makefile2,则,命令为:

>make -f makefile2

四、批处理文件与 makefile的综合使用

在此还是使用上面的列子
批处理文件maketest.bat文件如下:

ECHO OFF
ECHO ********************************
ECHO *         批处理文件
ECHO ********************************
ECHO *
ECHO ON
C:\BC31\BIN\make -f test.mak 

练习题:
利用批处理文件与 makefile的综合使用把上例中的3个源程序编译、连接、并生成可执行文件运行出结果,输出自己的姓名及学号。
解:把上例中的pa.c与pb.c中的输出语句分别换成学号及姓名即可。

我所学习的练习习题中还需要在文件中做更改,位置如下图:
记录学习嵌入式遇到的问题(一)手动编译链接单文件/多文件以及makefile与批处理文件的使用
需要把makefile、makefile2、test.bat(即windows批处理文件)中的地址c:\bc改为c:\bc31并且要把文件中缺\bc31的地方给加上(在\lib及\include前面),注意有这个代码的位置都需要改,不然会报错!
然后打开DBOX在中输入代码(需要一层一层的进入上图中文件夹中的位置):
在这里我附上图片(图片是按顺序输入代码的)
先输入dir命令,列出c盘中的所有文件及文件夹。
记录学习嵌入式遇到的问题(一)手动编译链接单文件/多文件以及makefile与批处理文件的使用
然后cd命令进入所要进入的文件夹,这里输入部分文件夹名按TAB键即可自动补全。
记录学习嵌入式遇到的问题(一)手动编译链接单文件/多文件以及makefile与批处理文件的使用
同理输入dir命令查看文件夹再输入cd命令进入文件夹。
记录学习嵌入式遇到的问题(一)手动编译链接单文件/多文件以及makefile与批处理文件的使用
记录学习嵌入式遇到的问题(一)手动编译链接单文件/多文件以及makefile与批处理文件的使用
然后输入执行批处理文件的命令
记录学习嵌入式遇到的问题(一)手动编译链接单文件/多文件以及makefile与批处理文件的使用
这样就是执行成功
记录学习嵌入式遇到的问题(一)手动编译链接单文件/多文件以及makefile与批处理文件的使用
最后一步直接运行生成的可执行文件test.exe
记录学习嵌入式遇到的问题(一)手动编译链接单文件/多文件以及makefile与批处理文件的使用
这里的运行结果我是没有进行修改的。如果修改之后并且操作正确,最后就会显示学号以及姓名。

最后我试了一下,自己直接写了一个makefile文件和一个批处理文件。最后执行结果也是一样的。
记录学习嵌入式遇到的问题(一)手动编译链接单文件/多文件以及makefile与批处理文件的使用

相关标签: 嵌入式