帮助gcc中的错误消息

时间:2009-05-28 08:56:37

标签: c linker

有关此错误的任何想法?

gcc   -oxtmpmain.exe xtmpmain.o fiber_driver.o xtmp_options.o getopt.o D:\usr\xtensa\XtDevToolsDE\in
stall\tools\RB-2008.4-win32\XtensaTools\lib\iss\xtmp.lib
xtmpmain.o(.text+0x213):xtmpmain.c: undefined reference to `_uart_setup'
xtmpmain.o(.text+0x2da):xtmpmain.c: undefined reference to `_uart_cleanup'
collect2: ld returned 1 exit status
make: *** [xtmpmain.exe] Error 1

2 个答案:

答案 0 :(得分:4)

这是一个明显的链接错误。您正在调用链接器未找到的两个函数uart_setup()uart_cleanup()

可能有多种原因,包括(但肯定不限于):

  • 他们真的很想念,也许你忘了链接一个目标文件
  • 命名空间阻止现有功能被发现
  • 图书馆路径
  • 编组或外部名称和下划线问题

没有更多细节,很难确定。

答案 1 :(得分:1)

这意味着xtmpmain.c调用名为uart_setup()uart_cleanup()的函数,但链接器找不到它们。您可能需要包含库,或者根据Win32 API为Windows实现这些功能。

有些“插入问题”是:

  • 是否声明了这些功能?
  • 是否定义了功能(即已实施)?
  • 正是这些名字?
  • 这些定义是否被预处理器排除?
  • 有一个gcc选项可以控制前导下划线的存在与否。您没有意外地将其用于一个文件而不是其他文件,对吗?
  • 验证声明的调用约定。 __cdecl__stdcall是非常不同的动物。它们通常会产生不匹配的导出符号名称以确保安全,这种错误可能就是这种情况的症状。

如果这是一个移植项目,那么UART相关功能的原始实现很可能是以平台相关的方式编写的。在这种情况下,它们通常会被某个依赖于编译时平台的#ifdef格式保护。

要解决这个问题,您需要为此平台实现它们,其风格与其在应用程序其余部分中的用法一致,并且同样受到保护。