libuv process spawn failed name too long

運(yùn)行環(huán)境:

Windows 10 專(zhuān)業(yè)版
Visual Studio 2019 Community/Professional
C++工程為一個(gè)較大項(xiàng)目,包含SDK在內(nèi)有90多個(gè)庫(kù),總計(jì)達(dá)6位數(shù)行數(shù)代碼

編譯問(wèn)題:

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

問(wèn)題的起源

這是由于CreateProcess函數(shù)的最長(zhǎng)命令行長(zhǎng)度為32767字符。這個(gè)限制來(lái)自于UNICODE_STRING結(jié)構(gòu)。而Windows上C++編譯是通過(guò)使用msbuild.exe命令行進(jìn)行,由于參數(shù)過(guò)長(zhǎng),導(dǎo)致CreateProcess失敗,致使編譯失敗。

檢查命令行參數(shù)

打開(kāi)Visual Studio,在編譯報(bào)錯(cuò)的庫(kù)上鼠標(biāo)右鍵打開(kāi)屬性,然后依次打開(kāi)配置屬性、C++、命令行,即看到命令行的所有參數(shù)。

可以將這些命令行復(fù)制到Visual Code的工具,全選即可看到字符數(shù)目。

解決方法

CMake工程中方法

  1. 檢查并減少該項(xiàng)目include_directories中的重復(fù)路徑,或沒(méi)有實(shí)際引用的路徑
  2. 如果include_directories中有引用到了相對(duì)路徑,需要將這些相對(duì)路徑替換成絕對(duì)路徑。這是由于cmake執(zhí)行include_directories時(shí),如果判斷到是相對(duì)路徑,則會(huì)在路徑前自行拼接當(dāng)前cmake的工程所在的路徑,最終使C++編譯的附加包含路徑變長(zhǎng)。

CMake與C++的混合改動(dòng)

當(dāng)include_directories中的某些路徑,所包含的頭文件比較少時(shí),可直接在C++項(xiàng)目中,將所有#include該頭文件的地方,在左邊拼接上一層該頭文件所在的目錄,此時(shí)即可將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)

改動(dòng)工程目錄結(jié)構(gòu)

在30000多字符的附加包含路徑中,具有大多重復(fù)的前綴路徑。此時(shí),可以將總的工程目錄往更上一級(jí)文件夾(或直至盤(pán)符目錄)移動(dòng),以減少重復(fù)的前綴路徑的長(zhǎng)度。

檢查命令行參數(shù),查找到某個(gè)包含最多的目錄,將該目錄適宜地往上一級(jí)文件夾移動(dòng),以達(dá)到縮短包含路徑的目的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容