2

我正在 ST ARM-Cortex-M3 上开发裸机 C 应用程序。我还开发了可用于所有这些应用程序的库。

我曾经使用 Keil ARM-MDK,但想改用 GNU-GCC。因此,我下载了最新版本的 GCC 并开始重新编译代码。

尽管已经回答了与此类似的问题,但它并没有解决我的问题,因此我发布了我的问题。

我有以下问题:Lib_Flash 有一个函数 Read_Flash()。Lib_AppCfg 在 Lib_Flash 中链接,因为它使用 Read_Flash()。我的应用程序(App)链接在 Lib_Flash 和 Lib_AppCfg 中。应用程序还使用 Read_Flash() 进行一些特定的 FLASH 检查。在 Keil MDK-ARM 中它运行良好。使用 GCC,在构建使用 Lib_AppCfg 的函数时,我收到错误消息,指出 Read_Flash() 是“未定义的引用”。我不确定问题出在哪里。是在构建 Lib_Appcfg 的链接中还是在我链接 App 时出现问题?

请指教。如果您需要更多信息,请告诉我。

4

2 回答 2

2

在我看来,您的库中存在排序问题。一些链接器将重新扫描命令行上的所有库,直到所有引用都被解析(或无法解析)。其他链接器沿链接线顺序工作。

特别是,这意味着如果库 A 定义了一个符号 SYM_A 和库 B 之后库 A 引用了这个符号,它不会在第二种类型的链接器上解析,并且您的链接将失败。

要解决此问题,您可以执行以下一项或多项操作

  1. 重新排序库
  2. 必要时在链接线上复制库
  3. 重构您的库,使它们之间不存在相互依赖关系(即 A 引用符号 SYMB,它在 B 中定义,但 B 引用 SYMA)
于 2012-08-31T14:40:28.583 回答
1

默认情况下,GNU 链接器按命令行上列出的顺序搜索库一次。因此,如果列表中后面的库引用了早期库或目标文件中定义的符号,则无法解析。

简单的解决方案是使用库分组;这会导致链接器重复搜索库列表,直到无法解析更多的 synbols。如果您单独调用链接器 (ld),则链接器选项为:

--start-group _Flash _AppCfg --end-group

或替代形式

-( _Flash _AppCfg -)

有关详细信息,请参阅GNU 链接器手册。如果通过 gcc 间接驱动链接器,则通过-Wl 选项传递链接器选项,例如:

-Wl,-(,_Flash,_AppCfg,-)

我认为。

于 2012-08-31T20:16:18.200 回答