c++ Windows makefile 32k param limit / *.o to *.a 文件链接



我正在努力解决以下问题。

我正在构建mbed_os,这是嵌入式MCU的操作系统。在编译过程中可以选择构建一堆 *.o 文件,或者将其链接到 *.a 库,然后将其与我自己的代码一起使用。

如果我构建mbed_os并单独列出我的 makefile 中的所有 *.o 文件,它运行良好,最终二进制文件运行良好。但是当我在编译过程中创建 *.a 库,然后将其列在我的 makefile 中时,最终二进制文件无法在 MCU 上运行,并且 MCU 看起来冻结了。但编译是成功的。这是我的第一个问题。

所以我可以通过在 makefile 中使用一堆 *.o 文件而不是单个 *.a 文件来暂时绕过 *.a 问题。但还有第二件事。

当我使用mbed_os的许多功能时,我当然需要非常多的 *.o 文件,并且在某些时候我会收到编译错误,例如">arm-none-eabi-gcc:错误:创建过程:没有这样的文件或目录"。经过一些谷歌搜索,我发现Windows cmd限制为32k,正如我所发现的,*.o文件列表略大于32k个字符。

有没有办法解决这个问题?

我的makefile中的*.o文件列表被添加到SYS_OBJECT变量中,例如

SYS_OBJECTS += ./_libs_/mbed-os_ ... AnalogIn.o
SYS_OBJECTS += ./_libs_/mbed-os_ ... BusIn.o
SYS_OBJECTS += ./_libs_/mbed-os_ ... BusInOut.o
SYS_OBJECTS += ./_libs_/mbed-os_ ... BusOut.o
...

我正在使用存储在

c:Program Files (x86)GNU ARM EclipseBuild Tools2.8-201611221915binmake.exe

和无臂-EABI-GCC-6.3.1。我的操作系统是Windows 10 PRO 10.0.14393。

重要的是,当我使用 Windows 10 bash 编译它时,一切正常,因此问题仅出现在 Win cmd 中。

如何绕过 32k 限制的解决方案很简单。感谢您的回复,尤其是对@Qix的回复。而不是生成文件中的这一行

$(PROJECT).elf: $(OBJECTS) $(SYS_OBJECTS)
$(LD) $(LD_FLAGS) -T$(LINKER_SCRIPT) $(LIBRARY_PATHS) -o $@ $^ $(LIBRARIES) $(LD_SYS_LIBS) $(LIBRARIES) $(LD_SYS_LIBS)

是保存到文件 .args 的参数.txt然后将对文件的引用作为参数传递给链接器

$(PROJECT).elf: $(OBJECTS) $(SYS_OBJECTS)
@echo $(LD_FLAGS) -T$(LINKER_SCRIPT) $(LIBRARY_PATHS) -o $@ $^ $(LIBRARIES) $(LD_SYS_LIBS) $(LIBRARIES) $(LD_SYS_LIBS) > .args.txt
$(LD) @./.args.txt

相关内容

最新更新