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