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()
- 参考:CMAKE_OBJECT_PATH_MAX
- 再或者命令行改Windows限制:
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/