我正在努力解决以下问题。
我正在构建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