我正在使用icc12制作一个包含三个文件的项目:
.s文件,包含汇编语言
中的一系列子例程.h文件,包含函数列表
.c程序包含我的主代码,我调用我的子程序
我的问题是,当我编译C程序时,编译器会显示以下错误:
!ERROR file 'filename.o': undefined symbol '_lcd_putstr'
!ERROR file 'filename.o': undefined symbol '_lcd_init'
!ERROR file 'filename.o': undefined symbol '_lcd_move'
!ERROR file 'filename.o': undefined symbol '_lcd_clear'
我一直在研究.o文件实际上是什么,我知道它是一个包含CPU理解的机器代码的目标文件。它们包含的信息允许链接器查看工作所需的符号。我仍然不明白如何解决这些错误。我检查过任何语法错误,但我似乎无法找到任何错误。是否有人能够提供一些帮助,告诉我如何制作这些符号'定义'在我的.o文件中?
我的构建命令是
#include <stdio.h>
#include <mc9s12dp512.h>
#include "lcd.h"
int main (void)
{
unsigned char keycode;
int keysave = 0;
DDRB = 0x00; /* make Port B an input port */
lcd_init(); // initialise the lcd module
lcd_clear(); // clear the lcd module
// print the welcome message on the LCD module
lcd_putstr(" message A ");
// move the cursor position down a line
lcd_move(1,1);
lcd_putstr(" message B ");
// move the cursor position down a line
lcd_move(1,2);
lcd_putstr(" message C ");
// move the cursor position down a line
lcd_move(1,3);
lcd_putstr(" message D ");
摘自_lcd_putstr
_lcd_putstr::
pshx
tfr d,x ; Transfer address of string to X
ldaa #WRDATA ; Set up command for write data
jsr WriteBytes ; Call subroutine to write byte to LCD
pulx
rts
答案 0 :(得分:1)
通常,编译在编译c源时会在标识符前面加下划线。如果您的编译器这样做,您必须将下划线添加到汇编程序文件中的子例程名称,并在.h文件中省略它,例如:
汇编程序文件中的名称:_lcd_putstr
.h文件中的原型:int lcd_putstr(void);
在.c文件中使用:n= lcd_putstr();
<小时/> 编辑:
&#34;当我编译我的C程序时,编译器显示以下错误[...]&#34;
您向我们展示的错误不是编译器错误。它们是链接器错误。 C文件被编译为.o文件。所有需要的.o和lib文件都由链接器组合成一个可执行文件。正是在这个阶段产生了错误消息:链接器无法找到这些符号。
您必须指示编译器生成.o文件。然后,您必须发出命令将对象链接到可执行文件中。您似乎没有或没有发出此命令。请参阅开发工具的文档,了解如何发出包含所有必需对象的链接命令。