将几个依赖库链接到我的“裸机”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 应用程序中的主要内容,如果未能解决你的问题,请参考以下文章