Makefile大型项目编译时候 (Argument list too long)后缀参数太长问题解决

Linux遇到“Argument list too long” 在Linux中使用cp, mv, rm, zip等命令时有时会遇到“Argument list too long”的错误,主要是要进行操作的文件过多导致的。是给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具。为结尾,由于各个系统中分号的意义不同,因此用。是指在指定文件夹下查找指定名称的文件。参数后面是指执行其后面的命令, 阅读详情
AI摘要

文章讲述了在使用Makefile编译大型项目时遇到参数列表过长的问题,通过将gcc命令的包含路径写入文件并使用@file方式解决。此外,还讨论了因固件大小超过限制导致的内存溢出问题,通过修改链接脚本增大相应段的大小来解决。

在用Makefile编译大型项目文件时出现了如下错误,提示参数列表过长,gcc 命令后缀是不能超过8000多个字节猜测。

通过查资料gcc 的后缀列表可以放到一个文件中,通过gcc @file 的方式来解决 Argument list too long ,

参考依据:Overall Options (Using the GNU Compiler Collection (GCC))

@file
  Read command-line options from file. The options read are inserted in place of the original @file option. If file does not exist, or cannot be read, then the option will be treated literally, and not removed.
  Options in file are separated by whitespace. A whitespace character may be included in an option by surrounding the entire option in either single or double quotes. Any character (including a backslash) may be included by prefixing
  the character to be included with a backslash. The file may itself contain additional @file options; any such options will be processed recursively.

修改Makfile,将头文件位置重定向到特定的文件中,再gcc @file 去编译:

#-----------------------------------------wl-------------------------add--------------
current_root_dir_temp1 = $(shell pwd)
current_root_dir_cover1 = $(subst \,/,$(current_root_dir_temp1))
current_root_dir1 = $(subst /cygdrive/c,C:,$(current_root_dir_cover1))
$(info "----------------------$(current_root_dir1)") 
current_root_dir2 = "$(current_root_dir1)/iROMXX.ccompincludelist"
$(info "----------------------$(current_root_dir2)") 

#add file path
#VCU APP
A =  -I\"$(current_root_dir)/Source/App/SWC_VCU/AccPed  \"
C := $(shell echo $A >> $(current_root_dir2))
A = -I\"$(current_root_dir)/Source/App/SWC_VCU/AccPedDev \"
C := $(shell echo $A >> $(current_root_dir2))
A = -I\"$(current_root_dir)/Source/App/SWC_VCU/ACCtl_TqDem \"
C := $(shell echo $A >> $(current_root_dir2))
A = -I\"$(current_root_dir)/Source/App/SWC_VCU/ActvDynWhlLd \"
C := $(shell echo $A >> $(current_root_dir2))
A = -I\"$(current_root_dir)/Source/App/SWC_VCU/AntiRollBack \"
C := $(shell echo $A >> $(current_root_dir2))
A = -I\"$(current_root_dir)/Source/App/SWC_VCU/AxleTqPreZrCrsng \"
C := $(shell echo $A >> $(current_root_dir2))

编译文件的位置:

#$(info "------wl------$(ATECH_USER_LINKFLAGS)")
$(info $(LDFLAGS));
.SECONDEXPANSION:
ifneq ($(LINK_LIBRARIES),1)
$(TARGET): $$(OBJS) $(LD_DEPENDENCIES) $(LINKER_COMMAND_FILE) \
           $(ADDITIONAL_OBJECTS_U) $(ADDITIONAL_LIBRARIES_U) \
           $(TARGET_LIBRARY) $(TARGET_RESPONSE_FILE) \
           $(wildcard Makefile.project.part.defines) \
           $(dir $(TARGET))/.dirstamp
    @$(ECHO) "LD         $@"
    $(Q)$(CC_ENV) $(LD) $(LDFLAGS) $(LINKER_OBJS_ARG)       \
                                   $(ADDITIONAL_OBJECTS_U)   \
                                   $(ADDITIONAL_LIBRARIES_U) \
                                   $(SYSLIBS)                \
                                   $(LD_REDIRECT_OUTPUT) \
                                   @$(current_root_dir2) \
                                   $(ATECH_USER_LINKFLAGS) 

这样虽然能解决问题,但是只是将.h的路径放到文件中了,.o文件路径没增加到文件中,且这样写法过于啰嗦,如是有了以下修改,利用Makefile中的foreach函数切割对应的环境变量后,重定向到文件中:

#-----------------------------------------wl-------------------------add--------------
current_root_dir_temp1 = $(shell pwd)
current_root_dir_cover1 = $(subst \,/,$(current_root_dir_temp1))
current_root_dir1 = $(subst /cygdrive/c,C:,$(current_root_dir_cover1))
$(info "----------------------$(current_root_dir1)") 
current_root_dir2 = "$(current_root_dir1)/iROMXX.ccompincludelist"
$(info "----------------------$(current_root_dir2)") 

#add file path
#VCU APP
ATECH_INCLUDES := $(foreach dir1,$(ATECH_INCLUDE),$(shell echo $(dir1) >> $(current_root_dir2)))

#$(info "$(B)") 
#-----------------------------------------wl-------------------------end--------------


current_root_dir3 = "$(current_root_dir1)/iROMXX.ccompincludelist2"
#C := $(shell echo $(LINKER_OBJS_ARG) >> $(current_root_dir3))
#WLLL := $(shell for var in echo ${LINKER_OBJS_ARG};do echo var >> $(current_root_dir3);done)
ATECH_OBJECTS := $(foreach dir,$(LINKER_OBJS_ARG),$(shell echo $(dir) >> $(current_root_dir3)))

.SECONDEXPANSION:
ifneq ($(LINK_LIBRARIES),1)
$(TARGET): $$(OBJS) $(LD_DEPENDENCIES) $(LINKER_COMMAND_FILE) \
           $(ADDITIONAL_OBJECTS_U) $(ADDITIONAL_LIBRARIES_U) \
           $(TARGET_LIBRARY) $(TARGET_RESPONSE_FILE) \
           $(wildcard Makefile.project.part.defines) \
           $(dir $(TARGET))/.dirstamp
    @$(ECHO) "LD         $@"
    $(Q)$(CC_ENV) $(LD) $(LDFLAGS) @$(current_root_dir3)     \
                                   $(ADDITIONAL_OBJECTS_U)   \
                                   $(ADDITIONAL_LIBRARIES_U) \
                                   $(SYSLIBS)                \
                                   $(LD_REDIRECT_OUTPUT) \
                                   @$(current_root_dir2) \
                                   $(ATECH_USER_LINKFLAGS) 

再次编译后出现下面错误 :

gcc region `BMHDO‘ overflowed by xxx bytes

这个原因是固件大小超过了特定的大小,修改链接脚本,本人这里的链接脚本vLinkGen_Template.ld,,这里是通过特定的环境变量LDFLAGS打印出来的。

-T script 是指定ld链接脚本

修改链接脚本,增大BMHDO section 的大小:

MEMORY
{
  DSPR_Core5 : ORIGIN = 0x10000000 , LENGTH = 0x00018000 /* 96 KiB */
  DSPR_Core4 : ORIGIN = 0x30000000 , LENGTH = 0x00018000 /* 96 KiB */
  DSPR_Core3 : ORIGIN = 0x40000000 , LENGTH = 0x00018000 /* 96 KiB */
  DSPR_Core2 : ORIGIN = 0x50000000 , LENGTH = 0x00018000 /* 96 KiB */
  DSPR_Core1 : ORIGIN = 0x60000000 , LENGTH = 0x0003C000 /* 240 KiB */
  DSPR_Core0 : ORIGIN = 0x70000000 , LENGTH = 0x00032FF0 /* 204 KiB */
  Variables_Shared : ORIGIN = 0x70032FF0 , LENGTH = 0x00000080 /* 16 Byte */
  StartupStack_Shared : ORIGIN = 0x70033000 , LENGTH = 0x00009000 /* 36 KiB */
  PFlash0_Boot_reserved : ORIGIN = 0x80000000 , LENGTH = 0x00060000 /* 384 KiB */
  StartupCode_FirstExecInst : ORIGIN = 0x80060000 , LENGTH = 0x00000500 /* 1 KiB */
  CoreExceptions_FirstExecInst : ORIGIN = 0x80060500 , LENGTH = 0x00000600 /* 512 Byte */
  PFlash0_Cached : ORIGIN = 0x80060700 , LENGTH = 0x0029F900 /* 3 MiB */
  PFlash1_Cached : ORIGIN = 0x80300000 , LENGTH = 0x002FFF00 /* 3 MiB */
  PFlash1_Info_reserved : ORIGIN = 0x805FFF00 , LENGTH = 0x00000300 /* 256 Byte */
  BMHD0 : ORIGIN = 0xAF400000 , LENGTH = 0x00000600 /* 512 Byte */
}

至此,完成对整个Makefile大型工程的修改。

参考文档:C Dialect Options (Using the GNU Compiler Collection (GCC))

Option Summary (Using the GNU Compiler Collection (GCC))

(37条消息) gcc @Commandfile解决命令过长问题_EarnForLive的博客-优快云博客

(37条消息) PX4固件编译问题region `flash‘ overflowed by 4253 bytes_gcc-arm-none-eabi-7.3.1_彩云的笔记的博客-优快云博客

Linux下Argument list too long错误的解决方法 处理Argument list too long错误的核心思路是避免一次性传递过多参数给命令。find+exec是最可靠的方法,而xargs和for循环也各有适用场景。这个错误让许多Linux用户感到困惑,特别是当目录中包含成千上万文件时。本文将分析这个问题的原因,并提供常见的解决方案。,可以使用-print或ls先查看匹配结果,避免误删重要文件。建立文件管理规范:按日期/项目分类存储文件。特别地,在执行大规模删除操作前,定期清理:避免让文件无限制积累。使用更具体的匹配模式:如。 阅读详情

相关推荐

解决“参数列表太长“问题的方法

一个常见的解决方法是使用文件来传递参数。当我们试图传递过多的参数给一个命令或函数时,这些参数会被串联成一个很长的字符串,超过了环境变量的限制,从而导致"参数列表太长"错误的出现。当我们试图传递过多的参数给一个命令或函数时,这些参数会被串联成一个很长的字符串,超过了环境变量的限制,从而导致"参数列表太长"错误的出现。与文件传递参数类似,我们可以将参数存储在一个环境变量中,然后在程序中读取该环境变量来获取参数。与文件传递参数类似,我们可以将参数存储在一个环境变量中,然后在程序中读取该环境变量来获取参数。

WqSmalltalk的博客 2179

Linux下出现 “Argument list too long”错误的解决

 原贴:http://www.linuxidc.com/Linux/2008-02/11043.htmLinux下出现 “Argument list too long”错误的解决mv [a-l]* ../directory2mv [m-z]* ../directory2这是4种方法里最简单的,但是远非理想的方法。你必须有办法平均分割文件,而且对于文件数目极多的情况,需要输入N遍

最实用的Linux博客 4225

深度学习---双层神经网络中矩阵的运算及其含义记录

深度学习---双层神经网络中矩阵的运算及其含义记录神经网络的正向传播与反向传播正向传播第一层的权重矩阵第一层的输入矩阵Z^1^ = W^1^X^1^ + b^1^A^1^ = σ(Z^1^)第二层的权重矩阵第二层的输入矩阵Z^2^ = W^2^A^1^ + b^2^反向传播dz^2^ = A^2^ - Ydw^2^ = 1/n dz^2^A^1T^db^2^ = 1/n np.sum(dz^2...

qq_43228441的博客 3745

“Argument list too long”解决方法

1. 背景 Linux下使用cp,mv,rm等命令时经常会碰到“Argument list too long”错误,这主要是因为这些命令的参数太长,即文件个数过多。 2. 解决方案 “Argument list too long”这个问题的解决主要会用到两个命令,find和xargs。 2.1 问题:要删除test文件夹下以jpg结尾的文件。 命令1为: find test/ -name "*.jpg" | xargs -i rm {} 命令2为: find test/ -name "*.

1万+

西门子S7-1500 PLC模块化编程与生产线自动化实践

PLC(可编程逻辑控制器)作为工业自动化核心设备,其模块化编程技术能显著提升产线控制系统的开发效率。通过SCL高级语言实现算法封装、功能块(FB)复用等工程实践,可构建稳定可靠的分层式控制架构。本文以西门子TIA Portal平台为例,详解S7-1500系列PLC在汽车零部件产线中的标准化应用方案,包含配方管理、设备联动等典型场景的SCL实现,以及Profinet通信、虚拟轴同步等进阶技巧。特别适用于需要快速实施中大型生产线自动化改造的工程师,提供经过验证的异常处理机制和模块化设计规范。

weixin_34341229的博客 457

Mendix 开发实践指南|Mendix平台概览

低代码开发是一种将编码从文本形式转变为视觉形式的应用开发方法。它提供了一个模型驱动的、拖放式的界面,而不是传统的编码环境,使得各种技能水平的开发者——包括专业开发人员、新手、主题专家、业务利益相关者和决策者——都能使用低代码工具来构建驱动价值的企业业务应用。低代码的核心在于提高开发的可访问性和效率,让更多人能够参与到应用开发中来​​。Mendix适用于多种应用场景,包括企业级应用、移动应用、物联网(IoT)应用和微服务架构等。

多年搬砖的经验分享... 4413

Makefile编译踩坑实录:从‘参数太长’到‘内存溢出’,我的嵌入式项目调试日记

本文记录了作者在嵌入式项目中使用Makefile编译时遇到的'参数太长'和'内存溢出'问题及其解决方案。通过详细分析GCC工具链的`@file`参数使用、Makefile高级技巧和链接脚本优化,提供了系统化的调试方法和最佳实践,帮助开发者高效解决类似编译问题。

weixin_30787531的博客 175

DIY等离子环:从Class-E电路到七彩辉光,手把手教你打造炫酷科学玩具

本文手把手教你DIY一个炫酷的等离子环科学玩具。从解析等离子体辉光放电原理入手,详细介绍了核心的Class-E自激振荡电路设计、关键元件选型与参数计算,并提供了从物料准备、电路搭建、腔体密封到上电调试的全流程指南。通过调制电路或填充不同气体,还能实现七彩变换与交互效果,是学习高频电路与电磁场知识的绝佳实践项目。

weixin_29305337的博客 634

E5-2696V3 + X99低成本编译Android 10:配置与调优实战

Android系统编译是一项对多核性能、内存容量和磁盘IO极为敏感的工程任务,其原理是通过并行调度将数万个源文件转化为系统镜像,过程中任何资源瓶颈都会导致耗时激增甚至失败。利用高核心数的服务器处理器可以显著提升编译吞吐量,而低成本平台则能极大降低搭建门槛。技术价值方面,采用E5-2696V3和X99芯片组主板,搭配大容量DDR3内存,能构建一台性价比极高的本地编译服务器,适用于ROM定制、framework二次开发、嵌入式系统构建等场景。本文基于华南X99 + E5-2696V3平台实测Android 10

weixin_33922672的博客 478

Aurix TC3xx系列MCU DMA模块配置方法(二)

本文主要基于英飞凌Aurix TC3xx系列MCU,通过EB tresos配置工具,介绍DMA驱动模块的配置方法。

m0_38045338的博客 2850

数学建模学习(5):最全概率分析之图表绘制详解,内容比较多,建议收藏

(1) 绘制正整数频率使用 tabulate(X) (2)

全栈川川 4592

【Linux】Argument list too long参数列表过长的办法-四种

Linux下使用cp,mv,rm,chmod等命令时经常会碰到“Argument list too long”错误,这主要是因为这些命令的参数太长,即文件个数过多。解决方案如下。

走在搬砖的路上! 9473

OpenClaw 从新手到中级完整教程【完整 持续更新版】

OpenClaw(曾用名 ClawdBot/Moltbot)是 2026 年最火的开源 AI Agent 项目,GitHub 已获得超过 68,000 星标。它不是普通的聊天机器人,而是一个真正能够执行任务的个人 AI 助理。

FeelTouch Labs 3115

初步分析make的一个问题:Argument list too long

一个同事在编译loadmodule时遇到了一个问题 gmake: execvp: /bin/sh: Argument list too long gmake: *** [     .o] Error 127   这种情况以前并没有遇到,一番google之后才知道

dean_yanqing的专栏 9814

CATIA V6二次开发——如何利用CaptureToFile截屏

CaptureToFile 今天给大家分享一个很有趣的功能,如何利用CATIA自带的功能输出模型展示图? 先上方法: 方法本身并不难,只需要赋予格式及输出路径即可完成该功能。结果如下: 看到这样一张图片不禁让我陷入了沉思,怎么会这么丑???? 那么如何让这个简单的功能变得有趣,图片变得好看点呢? 第一步:背景换色 第二步:隐藏结构树 ...

WorkMan的博客 2982

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Argument list too long 错误解决方法汇总

  这篇文章是回复前几天在论坛一个朋友提出的问题,今天有空,整理了一下,发布出来,供大家参考!   当Linux下试图传递太多参数给一个系统命令(ls *; cp *; rm *; cat *; etc…)时,就会出现"Argument list too long"错误。本文将提供4种解决方法,按复杂程度由低到高排列。   方法#1: 手动把命令行参数分成较小的部分   例1 m...

9hguslo 1124

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

四种解决”Argument list too long”参数列表过长的办法

四种解决”Argument list too long”参数列表过长的办法 转自 http://hi.baidu.com/cpuramdisk/item/5aa49ce00c0757aecf2d4f24 在linux中删除大量文件时,直接用rm会出现:-bash: /bin/rm: 参数列表过长,的错误。 这时可以用find命令来结合使用。 例: 1、rm

skykingf的专栏 16万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

当make执行遇到 Arguments too long

make 遇到 Arguments too long

ddxxii的博客 3723

解决执行shell命令时出现argument list too long错误的问题

如果执行shell命令时出现argument list too long的错误,其原因是需要操作的目标文件过多,比如超过2万个文件。 解决方式就是分批甚至逐个处理目标文件。 1. grep命令 命令行执行: grep "Java" * -l 如果返回: zsh: argument list too long: grep 命令改为: ls | xargs -n 100 grep "Java" -l 说明:-n参数表示每批执行多少条数据。 2. cp命令 命令行执行: cp -r *.zip ..

冰雪世界 3552

Argument list too long的解决方法

原因:文件太多了,导致传递给linux(或者说是cygwin)的参数太长了。 解决方法: 1、最土的方法,把工程拷贝到硬盘分区根目录,“有可能”可以解决问题。 2、大工程子模块化拆分。      a、引入子模块           [plain] view plaincopy $(call import-add-path,$

bihix33的专栏 1878

Argument list too long终极解决方案

本文针对linux下某个目录下文件巨多无法打包备份及删除而提供的解决方案,有需要的朋友可以了解下~~

qq_38963614的博客 1472

编译Android时出现make: execvp: /bin/bash: Argument list too long错误

http://web.nchu.edu.tw/~jlu/cyut/android/build21.shtml http://hi.baidu.com/pxdhkeiuajbglpd/item/ff2347e559a006f82a09a4b8 上述方法实际上是把Android.mk重写了,分别链接成几个子lib,然后在合并为一个整体的lib!

飞鸿惊雪 6129

聊聊 Linux Argument list too long 问题的N种解法

删除数百万文件的各种姿势,争取一篇给你讲全了!

一得同学 2万+

make execvp /bin/bash argument list too long

相信大家在编译Android或者其他的代码时候偶尔会遇到这个问题; 临时解决方法:$env - PATH=$PATH USER=$USER HOME=$HOME make xx -j8永久解决就需要改头文件编译内核了,比较麻烦;应该是/usr/include/limit.h里面;没试过。

baidu_35289599的博客 4319

Linux “Argument list too long“ 编译错误的解决

Ubuntu系统编译驱动时出现"Argument list too long"错误,原因是Make命令参数过长超过系统限制(默认2097152)。解决方法需修改Linux内核的MAX_ARG_STRLEN宏定义,增大参数长度限制后重新编译安装内核即可。该问题源于编译环境参数限制与实际需求不匹配。

1042484520@qq.com(邮箱) 1416
上一篇: Linux pinctrl子系统概念介绍和LED驱动示例
下一篇: C 调试宏
水火汪
博客等级 码龄9年 1314粉丝 99原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水火汪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值