飞思卡尔提供的9S12系列单片机开发工具包 CodeWarrior Development Studio中包含一个非常有用的工具 libmaker, 可以将编译后的 obj 文件打包为库文件。还可以对现有的库文件进行一些基本的修改。这东东有什么用呢,首先,将一系列的 obj 文件打包为库文件后会提高最后的 Link 阶段的速度。还可以将自己一些不愿公开的代码打包为库文件,有助于知识产权的保护。
不说废话了,还是以一系列的例子来说明问题。首先假设我们的项目中有三个源文件。分别如下:
/*add1.c*/
char add1(char a){ return a + 1;}
/*add2.c*/
char add2(char a){ return a + 2;}
/*add3.c*/
char add1(char a){ return a + 3;}
这3个文件真是没个性,不过对于说明问题已经够用了。
编译后会形成三个 Object 文件:add1.c.o add2.c.o add3.c.o
然后可以利用 libmaker 将这三个 object 文件打包为库文件了。这里需要些命令行操作,不熟悉的可以找些 win 批处理文件的教程看看。
首先,在 .o 文件所在目录建个 a.bat 的批处理文件。里面加入两行代码:
set PATH="D:\Program Files\Freescale\CWS12v5.1\Prog";%PATH%cmd /k
如果你的CWS12安装在不同的目录,请做相应的修改。然后双击 a.bat 文件,会打开一个命令行窗口,并且设置好环境变量。
执行下面的命令:
Libmaker -Cmd( add1.c.o + add2.c.o + add3.c.o = add.lib)
上面命令的 + 号可以省略,写为:
Libmaker -Cmd( add1.c.o add2.c.o add3.c.o = add.lib)
执行的结果是相同的,都是产生 add.lib 文件。好了,库文件已经生成了。可以测试了。在 main.c 中加几行:
add1(char a);
char add2(char a);
char add3(char a);
void main(void)
{
unsigned int data;
SCIInit();
SCISetBaudRate (SCI0, 9600, 8192000L);
EnableInterrupts;
data = 1;
data = add1(data); SCIPutChar(SCI0, data);
data = add2(data); SCIPutChar(SCI0, data);
data = add3(data); SCIPutChar(SCI0, data);
for(;;)
{
_FEED_COP(); /* feeds the dog */
} /* loop forever */
}
上面代码中加了些串口操作是为了防止编译器自作聪明的把我的代码优化掉。然后将 add.lib 加入到项目中,编译。一切OK!
Libmaker 还有些其他的功能,下面给一些简单的例子。
将一个obj 文件添加到现有库文件中,语法如下:
Libmaker -Cmd(add.lib + add4.c.o = add.lib)
将一个 obj 文件移出 库文件:
Libmaker -Cmd(add.lib - add1.c.o = add.lib)
知道这些就够一般的应用了。如果还需要了解更多,请参看 Build Tools Utilities Manual。