我正在努力解决以下问题。
我正在构建mbed_os,这是嵌入式MCU的操作系统。在编译期间有一组选项构建* .o文件,或者将它链接到* .a库,然后将它与我自己的代码一起使用。
如果我构建mbed_os并单独列出我的makefile中的所有* .o文件,它运行良好,最终二进制运行很好。但是当我在编译期间创建* .a库然后将其列在我的makefile中时,最终的二进制文件不会在MCU上运行,而MCU看起来会冻结。但汇编是成功的。那是我的第一个问题。
所以我可以通过在makefile中使用一堆* .o文件而不是单个* .a文件暂时绕过* .a问题。但还有第二件事。
当我使用mbed_os的很多功能时,我当然需要非常多的* .o文件,并且在某些时候我得到编译错误,如“ arm-none-eabi-gcc:error:CreateProcess:No such文件或目录“。经过一些谷歌搜索后,我发现windows cmd agrument有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
...
我正在使用存储在
中的GNU ARM Eclipse构建工具c:\Program Files (x86)\GNU ARM Eclipse\Build Tools\2.8-201611221915\bin\make.exe
和arm-none-eabi-gcc-6.3.1。我的操作系统是Windows 10 PRO 10.0.14393。
重要的是,当我使用Windows 10 bash编译它时,一切正常,所以问题只出现在Win cmd中。
答案 0 :(得分:0)
解决方案如何绕过32k限制很简单。感谢您的回复,尤其是@Qix。而不是makefile中的这一行
$(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