解决libuv process spawn failed name too long的编译问题

运行环境:

Windows 10 专业版
Visual Studio 2019 Community/Professional
C++工程为一个较大项目,包含SDK在内有90多个库,总计达6位数行数代码

编译问题:

AutoMoc subprocess error
------------------------
The moc process failed to compile
"SRC:/XXX.h"
into
"BIN:/XXX.cpp"
libuv process spawn failed: name too long

问题的起源

这是由于CreateProcess函数的最长命令行长度为32767字符。这个限制来自于UNICODE_STRING结构。而Windows上C++编译是通过使用msbuild.exe命令行进行,由于参数过长,导致CreateProcess失败,致使编译失败。

检查命令行参数

打开Visual Studio,在编译报错的库上鼠标右键打开属性,然后依次打开配置属性C++命令行,即看到命令行的所有参数。

可以将这些命令行复制到Visual Code的工具,全选即可看到字符数目。

解决方法

CMake工程中方法

  1. 检查并减少该项目include_directories中的重复路径,或没有实际引用的路径
  2. 如果include_directories中有引用到了相对路径,需要将这些相对路径替换成绝对路径。这是由于cmake执行include_directories时,如果判断到是相对路径,则会在路径前自行拼接当前cmake的工程所在的路径,最终使C++编译的附加包含路径变长。

CMake与C++的混合改动

当include_directories中的某些路径,所包含的头文件比较少时,可直接在C++项目中,将所有#include该头文件的地方,在左边拼接上一层该头文件所在的目录,此时即可将cmake中include_directories的这行路径去掉。代码示例如下:

C++文件:

#include "Prerequisites.h"
#include "Config/Prerequisites.h"

CMake文件:

include_diretories(${PROJECT_COMMON_DIR}/Core/Config)
include_diretories(${PROJECT_COMMON_DIR}/Core)

改动工程目录结构

在30000多字符的附加包含路径中,具有大多重复的前缀路径。此时,可以将总的工程目录往更上一级文件夹(或直至盘符目录)移动,以减少重复的前缀路径的长度。

检查命令行参数,查找到某个包含最多的目录,将该目录适宜地往上一级文件夹移动,以达到缩短包含路径的目的。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值