将几个依赖库链接到我的“裸机”C 应用程序中

Posted

技术标签:

【中文标题】将几个依赖库链接到我的“裸机”C 应用程序中【英文标题】:Linking several dependent libraries into my "bare metal" C application 【发布时间】:2012-08-31 14:34:45 【问题描述】:

我正在 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时的问题?

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

【问题讨论】:

这是一个链接错误。你能告诉我们你的编译命令吗? 您是否尝试重复Lib_Flash 库,如gcc app.c -o app -lFlash -lAppCfg - lFlash 中的? @AlexandreC.:GNU 链接器可以使用分组选项更智能地做到这一点 - 请参阅我的答案。那就是说您的“评论”是一个答案而不是对该问题的评论,为什么不将其作为一个发布呢? 【参考方案1】:

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

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

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

    重新排序库 在链接行复制库 必要的 重构你的库,这样就没有相互 它们之间的依赖关系(即 A 引用符号 SYMB,其中 在 B 中定义,但 B 引用 SYMA)

【讨论】:

【参考方案2】:

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

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

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

或其他形式

-( _Flash _AppCfg -)

详情请参阅GNU linker manual。如果通过 gcc 间接驱动链接器,则通过 -Wl option 传递链接器选项,例如:

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

我认为。

【讨论】:

感谢 Clifford,--start-group 和 --end-group 效果很好 :)

以上是关于将几个依赖库链接到我的“裸机”C 应用程序中的主要内容,如果未能解决你的问题,请参考以下文章

C++ 标准库如何链接到我的应用程序?

为啥zinemaker会出现动态链接库初始化例程失败

如何将脚本语言实现到 C 应用程序中?

CMake - 如何链接到我的项目打包的外部库?

如何编写不依赖操作系统的程序。就是裸机上可以运行的。汇编或c语言生成文件都是exe啊只能在win下

CMAKE将动态库链接到模块,但不显示为链接依赖