【问题标题】:Help with error message from gcc来自 gcc 的错误消息帮助
【发布时间】:2010-10-29 12:35:55
【问题描述】:

你知道这个错误吗?

gcc -oxtmpmain.exe xtmpmain.o fiber_driver.o xtmp_options.o getopt.o D:\usr\xtensa\XtDevToolsDE\in 失速\工具\RB-2008.4-win32\XtensaTools\lib\iss\xtmp.lib xtmpmain.o(.text+0x213):xtmpmain.c: 未定义对 `_uart_setup' 的引用 xtmpmain.o(.text+0x2da):xtmpmain.c: 未定义对 `_uart_cleanup' 的引用 collect2: ld 返回 1 个退出状态 make: *** [xtmpmain.exe] 错误 1

【问题讨论】:

    标签: c linker


    【解决方案1】:

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

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

    • 他们真的不见了,也许你忘了链接到一个目标文件
    • 命名空间使现有函数无法被发现
    • 库路径
    • 外部名称和下划线的编组或问题

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

    【讨论】:

      【解决方案2】:

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

      一些“是否插入问题”是:

      • 函数声明了吗?
      • 功能是否已定义(即已实现)?
      • 正是这些名字?
      • 预处理器是否排除了这些定义?
      • 有一个 gcc 选项可以控制前导下划线的存在与否。您不会不小心将它用于一个文件而不是其他文件,对吧?
      • 验证声明的调用约定。 __cdecl 和 __stdcall 是非常不同的动物。为了安全起见,它们通常会生成不匹配的导出符号名称,而此错误可能是其症状。

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

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

      【讨论】:

      • 怎么样?这两个 fns 是我在 xtmpmain.c 中定义的,和普通的 fns r8 类似吗?
      • 它们没有在链接行上命名的任何文件中使用那些确切的名称(没有前导下划线,这是常见的 C 名称修饰)定义,否则链接器会找到它们。仔细检查拼写,确保它们没有被#ifdef 等跳过。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-07
      • 1970-01-01
      • 2010-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多