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命令,查看当前目录的文件
什么是Map文件
简单来说,map文件就是通过编译器编译之后,生成的程序、数据及IO空间信息的一种映射文件,里面包含函数大小,入口地址等一些重要信息。从map文件我们可以了解到:
- 程序各区段的寻址是否正确
- 程序各区段的size,即目前存储器的使用量
- 程序中各个symbol的地址
- 各个symbol在存储器中的顺序关系(这在调试时很有用)
- 各个程序文件的存储用量
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
Comments | NOTHING
Warning: Undefined variable $return_smiles in /www/wwwroot/ogisosetsuna/wp-content/themes/Sakura/functions.php on line 1096