SDCC是一个开源的为嵌入式系统设计的C编译器。

一、使用SDCC

1.1单文件工程

如果工程只有一个源代码文件,只要用类似于

sdcc foo.c

的命令行就可以将源代码编译成intel hex格式的代码。

这中间sdcc会产生下列的输出文件:

foo.asm-汇编代码,由编译器创建

foo.lst-汇编列表文件,由汇编器创建

foo.rst-更新过的列表文件,由链接器创建

foo.sym-符号列表文件,由汇编器创建

foo.rel/foo.o-就是obj文件

foo.map-内存映射文件

foo.mem-内存使用统计文件

foo.ihx-intel hex格式的代码

如果使用了调试模式,还会有:

foo.adb-用于创建.cdb文件的含有调试信息的中间文件

foo.cdb-用于调试的文件,有一个专门的文档讲这种文件的格式

foo.-Absolute Object Module Format(AOMF)文件

foo.dump-用于调试编译器本身的dump文件

1.2多文件工程

假设main函数在foomain.c中,另外还有foo1.c和foo2.c,那么可以这样编译:

sdcc -c foo1.c

sdcc -c foo2.c

sdcc foomain.c foo1.rel foo2.rel

第三条命令也可以换成下面的两条命令:

sdcc -c foomain.c

sdcc foomain.rel foo1.rel foo2.rel

如果是写成后面这种形式,最后一条命令中的第一个rel文件必须包含main函数

1.3ihx文件的后处理

.ihx文件不能直接用于miniICP的输入往LPC900里面烧,要经过一步处理:

pachihx foo.ihx > foo.hex

这样foo.hex就可以拿去烧了

1.4使用lib库

如果要用到标准库之外的lib库,可以写这样的命令:

sdcc foomain.c foolib.lib -L mylib

-L选项指定库的搜索路径,可以是相对路径,也可以是绝对路径

sdcc的lib文件都是纯文本,自带的标准库的内容是相关rel文件的列表

用sdcclib做出来的lib是一种带标签的纯文本

1.5用sdcclib制作库

假设一个库libfoo.lib包括libfoo1.c和libfoo2.c两个源代码文件,可以这样来生成libfoo.lib:

sdcc -c libfoo1.c

sdcc -c libfoo2.c

sdcclib libfoo.lib libfoo1.rel

sdcclib libfoo.lib libfoo2.rel

这样得到libfoo.lib以后,还可以用

sdcclib -s libfoo.lib

查看库中包含的符号,或者用

sdcclib -m libfoo.lib

查看库中包含的rel文件的名字