使用xc32-ar打包静态库后链接报错undefined reference to main如何解决
问题解答:XC32链接静态库时找不到已存在的main符号问题
结论
可以正常完成链接,该报错是静态库链接顺序不符合GNU链接器的扫描规则导致的,不属于代码或者符号本身的问题。
根因分析
XC32使用的是基于GNU ld的链接器,静态库扫描规则如下:
- 链接器按命令行参数从左到右的顺序扫描输入文件
- 扫描静态库时,仅会提取当前已经产生的未定义符号所依赖的目标文件,未被依赖的目标文件会被直接忽略
- 你的链接命令中,包含
main符号的MyApp.X.a放在最左侧,此时链接器还未扫描到C runtime启动文件中_main_entry对main的引用,因此不会把Main.o从库中提取出来参与链接 - 后续扫描到启动文件的
main引用时,已经跳过了MyApp.X.a,最终触发未定义引用报错
解决方法
三种方案任选其一即可:
- 调整库的链接顺序,将包含
main的MyApp.X.a放到所有库的最右侧,示例命令修改如下:
"C:\Program Files (x86)\Microchip\xc32\v2.30\bin\xc32-gcc.exe" -mprocessor=PIC32MX340F512H -o dist/default/production/MyApp.X.production.elf ..\..\MyLib\MyLib.X\dist\default\production\MyLib.X.a dist/default/production/MyApp.X.a -DXPRJ_default=default -legacy-libc -Wl,--defsym=__MPLAB_BUILD=1,--defsym=_min_heap_size=2576,--no-code-in-dinit,--no-dinit-in-serial-mem,-L"include/BM",-Map="dist/default/production/MyApp.X.production.map",--report-mem,--memorysummary,dist/default/production/memoryfile.xml -mdfp="C:/Users/Public/.mchp_packs/Microchip/PIC32MX_DFP/1.5.259"
- 强制加载整个静态库的所有目标文件,在
MyApp.X.a前后加--whole-archive相关选项:
"C:\Program Files (x86)\Microchip\xc32\v2.30\bin\xc32-gcc.exe" -mprocessor=PIC32MX340F512H -o dist/default/production/MyApp.X.production.elf -Wl,--whole-archive dist/default/production/MyApp.X.a -Wl,--no-whole-archive ..\..\MyLib\MyLib.X\dist\default\production\MyLib.X.a -DXPRJ_default=default -legacy-libc -Wl,--defsym=__MPLAB_BUILD=1,--defsym=_min_heap_size=2576,--no-code-in-dinit,--no-dinit-in-serial-mem,-L"include/BM",-Map="dist/default/production/MyApp.X.production.map",--report-mem,--memorysummary,dist/default/production/memoryfile.xml -mdfp="C:/Users/Public/.mchp_packs/Microchip/PIC32MX_DFP/1.5.259"
- 若该静态库仅包含
Main.o,可直接将Main.o作为输入文件加入链接命令,无需打包为静态库,即可绕开静态库扫描规则限制。
内容的提问来源于stack exchange,提问作者Mick
相关产品推荐
相关产品推荐

