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

时间:2017-05-15 18:55:34

标签: windows arm

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

我正在构建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中。

1 个答案:

答案 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