1.在VitualBox或者VMware虚拟机中安装Windows XP。

(BC45是32位程序,XP兼容性更好,XP还能运行16位的程序)

2.下载安装BC45,软件下载地址:【Borland C++】Borland C++ 免费下载

3.在虚拟机中安装BC45和  TASM5.0 ,BC45+TASM5.0下载链接

4.使用BCC工具编译代码

用文本编辑器创建一个c代码

//test.c
#include <stdio.h>
void main()
{
	printf("Hello,World!\n");
}

5.使用BCC命令将C文件编译为obj

bcc -c -ml -Ic:\bc45\include  -I.\  -Lc:\bc45\lib test.c

使用Win+R组合键打开运行,输入cmd进入DOS命令符。使用CD C:\Documents and Settings\......\C_Code命令,进入存放代码的文件夹。使用上面的BCC命令编译,若编译成功,会得到一个TEST.OBJ文件。

  • 【编译】︰根据当前源代码编译成二进制目标文件(即.obj文件)
  • 【链接(link)】:将生成的.obj文件与库文件.lib等文件链接,生成可执行文件(.exe文件)。

一个现代【编译器】的主要工作流程如下:
源程序(source code)→预处理器(preprocessor)一编译器(compier)→汇编程序(assembler)→目标程序(object code)→连接器(链接器,Linker)→可热行程序(executables)
因些,是先有OBJ这个目标文件、然后再生成exe可执行二进制文件。两个都是二进制文件、区那就在于exe文件是经过link处理后形成的。可以简单理解如下:
由.c或.cpp的源程序经过编译生成机器可理解执行的二进制文件,这个文件就是obj,但是不完整,需要经过链接器同c或cpp的标准库以及其他用户自己的库进行连接,将多个obj文件生成一个exe。因此也可以把obj看成是exe的一部分(但实际上链接obj文件是很复杂的)。OBJ只给出了程序的相对地址,而可执行文件是绝对地址。

6.使用tlink命令连接,生成可执行文件

tlink c:\bc45\lib\c0l.obj test.obj,test,test,c:\bc45\libl\cl.lib

使用连接器的命令格式为:
tlink [选项…]目标文件名[目标文件名…],最终可执行文件名, map文件名,lib文件名, def文件名.

若操作正确,目录会生成test.map文件和exe可执行文件。

也可以使用DIR命令,查看当前目录的文件

直接输入test命令,可以启动编译好的DOS程序:

什么是Map文件

简单来说,map文件就是通过编译器编译之后,生成的程序、数据及IO空间信息的一种映射文件,里面包含函数大小,入口地址等一些重要信息。从map文件我们可以了解到:

  • 程序各区段的寻址是否正确
  • 程序各区段的size,即目前存储器的使用量
  • 程序中各个symbol的地址
  • 各个symbol在存储器中的顺序关系(这在调试时很有用)
  • 各个程序文件的存储用量
可以使用记事本打开MAP文件。

7,多文件程序的编译、连接

一般的工程文件中,会有多个源文件,要把多个头文件和C源代码文件编译成一个可执行的程序,一般过程是:

首先用bcc命令将各个C文件编译为对应的obj文件,再用tlink将obj文件和库文件进行链接生成可执行文件。

创建pa.c、pb.c和对应的头文件:

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

void A_print()
{
  printf("AAAAAAAAAAA\n");
}
/**********************************************************************************************************************/
//pa.h
#ifndef PA_H
#define PA_H

void A_print();
#endif
/**********************************************************************************************************************/
//pb.c
#include <stdio.h>
#include "pb.h"
void B_print()
{
	printf(" BBBBBBBB\n");
}

/**********************************************************************************************************************/

//pb.h
#ifndef PB_H
#define PB_H
void B_print();

#endif
/**********************************************************************************************************************/
//main.c
#include "pa.h"
#include "pb.h"
void main()
{
	for(;;)
	{
		A_print();
		B_print();
	}
}

使用tlink命令分别编译成对应的obj文件:

bcc -c -ml -Ic:\bc45\include -I.\ -Lc:\bc45\lib pa.c
bcc -c -ml -Ic:\bc45\include -I.\ -Lc:\bc45\lib pb.c
bcc -c -ml -Ic:\bc45\include -I.\ -Lc:\bc45\lib main.c

使用tlink命令将三个OBJ文件连接成可执行文件:

tlink C:\BC45\LIB\C01.OBJ pa.OBJ pb.OBJ main.OBJ ,test,test, C:\BC45\LIB\CL.LIB

运行main,CMD会循环打印AAAAA和BBBBBB


懒惰是进步的催化剂,也是失败的引擎。