使用ar创建静态库时参数列表过长问题咨询
解决msys2下ar参数列表过长的问题
不用更新ar工具,这个问题的根源是Windows系统的命令行参数长度限制,和ar版本无关——msys2的shell只是传递参数的载体,核心解决思路是用ar的响应文件功能绕过参数长度限制:
Makefile中修改方式:
把所有目标文件的路径写入一个文本文件,让ar通过读取这个文件来获取输入列表,而非直接把所有文件作为命令行参数传递。示例代码:# 定义目标文件和输出库 OBJS := $(wildcard src/*.o) TARGET_LIB := libmylib.a $(TARGET_LIB): $(OBJS) # 将目标文件列表写入临时文件 echo $^ > objs_list.txt # 用@符号引用响应文件执行ar命令 ar rcs $@ @objs_list.txt # 删除临时文件 rm -f objs_list.txtRakefile中修改方式:
错误码127本质是ar命令因参数过长执行失败,同样改用响应文件方式。示例代码:objs = Dir['src/*.o'] target_lib = 'libmylib.a' file target_lib => objs do # 生成目标文件列表的临时文件 File.write('objs_list.txt', objs.join(' ')) # 调用ar并引用响应文件 sh "ar rcs #{target_lib} @objs_list.txt" # 删除临时文件 File.delete('objs_list.txt') end原理说明:
Windows系统对单条命令的参数长度有原生限制(早期为8192字符,后续虽有扩展但仍有限度),ar工具本身支持通过@文件名的方式读取文件中的参数列表,这是处理大量输入文件的标准方案,和ar版本无关,更新ar无法解决参数长度限制问题。
内容的提问来源于stack exchange,提问作者Orang Keren
相关产品推荐
相关产品推荐

