问题复现:
由于RealEvo IDE在Windows下使用的sh.exe支持的命令长度有限(命令要小于16K),如果需要编译的源文件过多,可能会报溢出错误或"make (e=87): 参数错误。"等,典型的表现型式有:
我这里是创建了0.c、1.c~999.c,编译为一个动态库,来复现这个错误。系统自动生成的mk文件为:test_big_range_so.mk。
解决方案:
由于问题出现的原因显而易见,就是在编译过程中,执行到链接阶段时,由于需要链接的.c文件过多,导致链接的那一条命令长度超出16K,从而导致报错。
这里我提供两种解决方案。
1. 人为收束
既然是因为命令过长导致错误,那在不能削减编译文件数量的前提下,可以考虑将降低源文件的目录深度。即将一些无用的上级目录删去,或减短目录名称,以达到降低链接命令长度的目的。
本方案适用于工程文件数量并没有超出太多,且不想打开专家模式的用户。好处是如果能通过削减目录的方式达到成功执行链接指令,则不需要人为修改makefile,避免由于不熟悉专家模式而引入的其他问题。
2. 修改makfile
修改makefile适用于任何场景,原理就是将大量的源文件分段处理。以我这个工程为例,可以将0.c~249.c作为part1,250.c~499.c作为part2,500.c~749.c作为part3,750.c~999.c作为part4,怎么分完全是个人爱好。接着编译阶段保持不变,手动加入链接命令,分别AR每个PART的.o文件,则每次链接命令和ar命令都不会超出16K。
修改后的mk文件:test_big_range_so.mk
修改部分:
。
。
同理,如果是APP编译,将$($(target)_SO)改为$($(target)_EXE),再对应修改$(__LD)后的参数即可。
2021年8月9日 20:45 1F
赵哥,4.0ide好像有个short command选项,勾上那个就可以解决了
2022年1月11日 17:54 B1
@ gewenbin 厉害
2021年8月13日 17:36 2F
太牛了