1. 问题

Ubuntu20.04上make编译生成so的时候报错:

make[1]:execvp:/bin/sh:Arguments too long

对应makefile中的报错位置,仅仅是生成so的时候报错,伪代码如下

${build_tool} -shared -fpic -o "$@" ${OBJ_FILE} ${LDFLAGS}

然而如果不通过make执行,将后面的参数打印出来后,直接用交叉编译链执行是可以的,所以怀疑方向是在make

2. 分析:

(1)查看系统命令缓冲区大小,通过命令

xargs --show-limits

执行结果:

同时我也将这个库的合包段参数打出来看,确实很多 ,达到了 262 822(超过了系统 命令缓冲区的大小: 131072)

(2)进行一系列查询,到了ubuntu官方去查询,在make的changelog中又有找到类似问题的修复说明:


进一步在4.1的新版本4.1.9中的diff里找到有对应的修复4.1.9-diff,但4.2.1的版本里却没看到相关补丁内容,看起来是没有合到4.2.1中,那接下来尝试回退版本试试

3. 更新make版本实验验证

搭建虚拟机,匹配到Ubuntu 20.04,先用安装make V4.2.1版本进行编译复现问题,再降级到补丁的make版本进行编译观察是否解决
####(1)make V4.2.1版本安装: 装虚拟机后再 apt安装make即可

确认安装后Make版本一致,均为4.2.1,接下来进行make编译

编译结果现象一致

(2)补丁版本降级安装:

下载补丁版本:

https://mirrors.tscak.com/ubuntu/pool/main/m/make-dfsg/

下载对应的deb,我的安装包:

ubuntu-20.04.1-desktop-amd64.iso,uname -a

也看得到

root@ubuntu:~/make-4.1.9# uname -a Linux ubuntu 5.15.0-60-generic #66~20.04.1-Ubuntu SMP Wed Jan 25 09:41:30 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux

所以下载:make_4.1-9.1ubuntu1_amd64.deb

下载到了直接编译好的deb,然后进行安装(中间遇到两次报错也记录了出来,也可以直接看最后一次正确安装)

root@ubuntu:~/make-4.1.9# sudo apt install make_4.1-9.1ubuntu1_amd64.deb
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package make_4.1-9.1ubuntu1_amd64.deb

报错:

Unable to locate package make_4.1-9.1ubuntu1_amd64.deb

注意:(1)一定找对目录,到存在deb文件目录 (2)要安装的文件需要真的在这个文件夹下,然后以相对路径去执行,即加上 ./

root@ubuntu:~/make-4.1.9# sudo apt install -y ./make_4.1-9.1ubuntu1_amd64.deb
Reading package lists... Done
Building dependency tree
Reading state information... Done
Note, selecting 'make' instead of './make_4.1-9.1ubuntu1_amd64.deb'
Suggested packages:
make-doc
The following packages will be DOWNGRADED:
make
0 upgraded, 0 newly installed, 1 downgraded, 0 to remove and 238 not upgraded.
E: Packages were downgraded and -y was used without --allow-downgrades.

报错:

Packages were downgraded and -y was used without --allow-downgrades.

正确安装:由于 包已经下在本地了,所以不需要-y, 去掉后重新装一次:

root@ubuntu:~/make-4.1.9# sudo apt install  ./make_4.1-9.1ubuntu1_amd64.deb
Reading package lists... Done
Building dependency tree
Reading state information... Done
Note, selecting 'make' instead of './make_4.1-9.1ubuntu1_amd64.deb'
Suggested packages:
make-doc
The following packages will be DOWNGRADED:
make
0 upgraded, 0 newly installed, 1 downgraded, 0 to remove and 238 not upgraded.
Need to get 0 B/154 kB of archives.
After this operation, 12.3 kB disk space will be freed.
Do you want to continue? [Y/n] y
Get:1 /root/make-4.1.9/make_4.1-9.1ubuntu1_amd64.deb make amd64 4.1-9.1ubuntu1 [154 kB]
dpkg: warning: downgrading make from 4.2.1-1.2 to 4.1-9.1ubuntu1
(Reading database ... 238557 files and directories currently installed.)
Preparing to unpack .../make_4.1-9.1ubuntu1_amd64.deb ...
Unpacking make (4.1-9.1ubuntu1) over (4.2.1-1.2) ...
Setting up make (4.1-9.1ubuntu1) ... Processing triggers for man-db (2.9.1-1) ...
N: Download is performed unsandboxed as root as file '/root/make-4.1.9/make_4.1-9.1ubuntu1_amd64.deb' couldn't be accessed by user '_apt'. - pkgAcquire::Run (13: Permission denied)
root@ubuntu:~/make-4.1.9# make --version
GNU Make 4.1
Built for x86_64-pc-linux-gnu
Copyright (C) 1988-2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
root@ubuntu:~/make-4.1.9#

这里就能看到,原本是 4.2.1-1.2 降级到了 4.1-9。接下来再进行make,就能通过了

当make执行遇到 Arguments too long相关推荐

  1. 【selenium】执行js脚本

    在当前窗口或框架上下文中,执行 JavaScript 脚本. 使用JavaScript操作页面: 解决点击不生效的问题 页面滚动 修改元素属性 JavaScript // 进入浏览器 -> 检查 ...

  2. JS学习笔记-OO疑问之封装

    封装是面向对象的基础,今天所要学习的匿名函数与闭包就是为了实现JS的面向对象封装.封装实现.封装变量,提高数据.系统安全性,封装正是面向对象的基础. 一.匿名函数 即没有名字的函数,其创建方式为 fu ...

  3. 前端基础入门四(JavaScript基础)

    为什么80%的码农都做不了架构师?>>>    目标: 掌握编程的基本思维 掌握编程的基本语法 我们先来学习JavaScript基础,后续会讲解JavaScript高级. 自己是个做 ...

  4. 19号以后包括数组在内的所有内容(数组、函数、方法、dom操作)

    数组: 1.数组就是许多变量,他们的名称和数据类型都是一致的. 数组元素:就是数组里面的每一项 2.数组下标: 数组的下标是0的元素是数组的第一个元素(数组的下标是从0开始的). 3.获取数组的长度: ...

  5. 自已脚本开发常用的底层方法

    脚本下载地址:/Files/cocoxye/winBasics.rar 仅适用于原生脚本开发,同jquery会有冲突,主要存在于$选择器上. 常用变量 doc =document   doe =doc ...

  6. JavaScript中奇妙的replace

    1.发现问题: 今天在读require.js源代码时,不经意读到这么一段代码: 1 //If no name, and callback is a function, then figure out ...

  7. JavaScript 专题之函数柯里化

    JavaScript 专题系列第十三篇,讲解函数柯里化以及如何实现一个 curry 函数 定义 维基百科中对柯里化 (Currying) 的定义为: In mathematics and comput ...

  8. main()函数参数

    很多人学了很长时间的C语言,可能还不知道mian()函数也是有参数的,甚至会说,main()函数哪来的参数,我从来都没见到过,更没有使用过,然而,不得不说,main()函数确实是有参数的. main函 ...

  9. 一个apply的实例

    看apply函数的理论知识的时候觉得很简单,但后来看到书上一段小代码,发现之前并没有深刻地理解这个函数,这里记下来做个笔记. 代码如下: function r(x){ return x; } func ...

最新文章

  1. IIS6 MVC3 配置
  2. 深入微服务 API 网关之架构实践篇
  3. NT式驱动和WDM式驱动程序
  4. mysql语言的简介_谁能帮我介绍一下 MY SQL ?
  5. java网络编程(一)
  6. 领域驱动设计学习之路—DDD的原则与实践
  7. 通过配置文件登陆有密码的mysql不需要输入密码
  8. 纷享销客完成新一轮数亿元融资,持续领跑中国CRM产业发展
  9. linux设置send时间,[转]Socket 的send,recv在windows与linux下的超时设置
  10. 什么是5G?居然有人用漫画把它讲得如此接地气!
  11. 荣之联生物领域再扩张 同清华大学共建生物云实验室
  12. C语言题目:平均成绩,已知某个同学的语文、数学、英语成绩,计算该同学的平均分
  13. PC_溢出概念+判断方法+示例
  14. 成功解决TypeError: can‘t multiply sequence by non-int of type ‘float‘
  15. 解除网卡绑定(多台电脑上网)
  16. 8086汇编(7、80x25彩色缓冲区)
  17. 如何把1个pdf拆分几个pdf
  18. GB28181平台对接接口详解
  19. Spark-SQL 多维度聚合优化
  20. 如何做好rebuttal

热门文章

  1. xsens系列MTI-670使用时出现的问题
  2. Keil5安装教程(C51与MDK共存)
  3. 如何防止被路由器限速-如何更改电脑网卡的MAC地址
  4. Android Handler消息机制源码解析
  5. linux命令 ll 搜索_Linux grep 命令
  6. python移动追踪目标检测
  7. 打卡第4天:安恒元旦杯-爆破鬼才与CRC
  8. 屏蔽百度蜘蛛或某一爬虫的四种方法
  9. 「镁客·请讲」险境求生,《风暴Storm》用写剧本的方式打造全新VR游戏体验
  10. python format左对齐_Python_format格式化输出基础篇