关于Qt部署CMake导致“Failed to set working directory to”的问题

2024年7月23日补充:该目录过深的情况只在Win10上有发现,Win11则没有问题,且Win11可以在DevHome中设置LongPath。

---------------------------------------------------------------------------------------------------------------

使用qt部署Cmake项目时,遇到"Failed to set working directory to"的错误(还没编译),然后查看部署信息发现:
“The CXX compiler identification is unknown”、“CMake Error at xxxx/CMakeTestCXXCompiler.cmake:56 (try_compile):”

[cmake] -- The CXX compiler identification is unknown
[cmake] -- Check for working CXX compiler: C:/01_Software/06_QT/Tools/mingw1120_64/bin/g++.exe
[cmake] CMake Error at C:/01_Software/06_QT/Tools/CMake_64/share/cmake-3.29/Modules/CMakeTestCXXCompiler.cmake:56 (try_compile):
[cmake]   Failed to set working directory to
[cmake]   C:/02_MyRepository/Qt6_CPlusPlus_Learning/My_Source_Code/chapter_06_EventsDealt/sample_6.1_QPaintEvent&QCloseEvent&QMouseEvent&QKeyEvent&QShowEvent&QHideEvent/TestWidgetTypicalEvent/build/Desktop_Qt_6_7_2_MinGW_64_bit-Debug/CMakeFiles/CMakeScratch/TryCompile-efahz1
[cmake]   : No such file or directory
[cmake] Call Stack (most recent call first):
[cmake]   CMakeLists.txt:3 (project)
[cmake] 
[cmake] 
[cmake] -- Configuring incomplete, errors occurred!
  • 报错截图:

  • 在这里插入图片描述

  • 先说结论吧:其实是因为目录过长目录过深导致的

  • 虽然按照参考设置了Cmake的工程路径最大长度和文件名最大长度,也改过Windows的文件最大长度限制,但是都没用!

  • 例如CMakeLIsts里加上:

set(CMAKE_OBJECT_PATH_MAX 2048)
set(CMAKE_OBJECT_NAME_MAX 512)
if (WIN32)
    set(CMAKE_OBJECT_PATH_MAX 2048)
    set(CMAKE_OBJECT_NAME_MAX 512)
endif()
if(CMAKE_HOST_UNIX)
  execute_process( COMMAND getconf PATH_MAX /
    OUTPUT_VARIABLE OBJECT_PATH_MAX OUTPUT_STRIP_TRAILING_WHITESPACE)
  execute_process( COMMAND getconf NAME_MAX /
    OUTPUT_VARIABLE OBJECT_NAME_MAX OUTPUT_STRIP_TRAILING_WHITESPACE)
endif()
New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem" -Name "LongPathsEnabled" -Value 1 -PropertyType DWORD -Force
  • 具体参考stackoverflow上的这个问题:maximum-path-lengths-with-cmake
  • maximum-file-path-limitation
  • 后面找到原输出信息发现是CMakeTestCXXCompiler.cmake:56 (try_compile)这个文件中的第56行的try_complie出现问题,找不到临时生成的文件夹:`CMakeScratch/TryCompile-xxxx在这里插入图片描述
  • Cmake中该操作是会在${CMAKE_BINARY_DIR}/CMakeFiles/CMakeScratch这个路径下面生成一个独特的哈希后缀文件夹,该文件夹是临时的,可以加上--debug-trycompile命令让他不删除保留然后看里面的.cmake文件;
  • CMake automatically generates, for each try_compile operation, a unique directory under ${CMAKE_BINARY_DIR}/CMakeFiles/CMakeScratch with an unspecified name. These directories are cleaned automatically unless --debug-trycompile is passed to cmake.
  • 参考原文:try_compile
  • 参考其他链接:
  • 然后又去检查Qt的Cmake命令参数和环境,对比能正常部署的Cmake和这个不能正常部署的Cmake命令参数:
  • 这个是正常的Cmake配置:
-DCMAKE_ADDR2LINE:FILEPATH=C:/01_Software/06_QT/Tools/mingw1120_64/bin/addr2line.exe
-DCMAKE_ADDR2LINE:FILEPATH=C:/01_Software/06_QT/Tools/mingw1120_64/bin/addr2line.exe
-DCMAKE_AR:FILEPATH=C:/01_Software/06_QT/Tools/mingw1120_64/bin/ar.exe
-DCMAKE_AR:FILEPATH=C:/01_Software/06_QT/Tools/mingw1120_64/bin/ar.exe
-DCMAKE_BUILD_TYPE:STRING=Debug
-DCMAKE_BUILD_TYPE:STRING=Debug
-DCMAKE_COLOR_DIAGNOSTICS:BOOL=1
-DCMAKE_COLOR_DIAGNOSTICS:BOOL=1
-DCMAKE_CXX_COMPILER:STRING=C:/01_Software/06_QT/Tools/mingw1120_64/bin/g++.exe
-DCMAKE_CXX_COMPILER:STRING=C:/01_Software/06_QT/Tools/mingw1120_64/bin/g++.exe
-DCMAKE_CXX_COMPILER_AR:FILEPATH=C:/01_Software/06_QT/Tools/mingw1120_64/bin/gcc-ar.exe
-DCMAKE_CXX_COMPILER_AR:FILEPATH=C:/01_Software/06_QT/Tools/mingw1120_64/bin/gcc-ar.exe
-DCMAKE_CXX_COMPILER_RANLIB:FILEPATH=C:/01_Software/06_QT/Tools/mingw1120_64/bin/gcc-ranlib.exe
-DCMAKE_CXX_COMPILER_RANLIB:FILEPATH=C:/01_Software/06_QT/Tools/mingw1120_64/bin/gcc-ranlib.exe
-DCMAKE_CXX_FLAGS:STRING=
-DCMAKE_CXX_FLAGS:STRING=
-DCMAKE_CXX_FLAGS_DEBUG:STRING=-g
-DCMAKE_CXX_FLAGS_DEBUG:STRING=-g
-DCMAKE_CXX_FLAGS_INIT:STRING=
-DCMAKE_CXX_FLAGS_INIT:STRING=
-DCMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG
-DCMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG
-DCMAKE_CXX_FLAGS_RELEASE:STRING=-O3 -DNDEBUG
-DCMAKE_CXX_FLAGS_RELEASE:STRING=-O3 -DNDEBUG
-DCMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG
-DCMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG
-DCMAKE_CXX_OUTPUT_EXTENSION:STRING=.obj
-DCMAKE_CXX_OUTPUT_EXTENSION:STRING=.obj
-DCMAKE_CXX_STANDARD_LIBRARIES:STRING=-lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32
-DCMAKE_CXX_STANDARD_LIBRARIES:STRING=-lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32
-DCMAKE_C_COMPILER:FILEPATH=C:/01_Software/06_QT/Tools/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Taiga_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值