关于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/
<think>好的,我现在需要帮助用户解决CMake在Xcode生成器不匹配的问题,以及处理CMakeCache.txt文件冲突。首先,用户遇到的错误信息是“CMake error Xcode 1.5 not supported generator mismatch Unix Makefiles vs Xcode remove CMakeCache.txt or use correct binary directory cmake qt ios build”。看起来问题涉及生成器不匹配,可能是用户之前使用了不同的生成器(如Unix Makefiles)而现在尝试使用Xcode,导致冲突。 首先,我应该回顾CMake生成器的基础知识。CMake生成器决定了构建系统,比如Unix Makefiles会生成Makefile,而Xcode生成器会生成Xcode项目。如果用户之前用了一个生成器,然后切换另一个,而没有清理缓存,CMakeCache.txt可能还保留旧的配置,导致不匹配。 接下来,用户提到需要处理CMakeCache.txt的冲突。通常,解决这类问题的方法是删除CMakeCache.txt和CMake生成的其它文件,然后重新运行CMake。这可以确保旧的配置不会干扰新的生成器设置。 另外,用户可能在构建Qt项目,并且针对iOS平台。这时候需要确认是否正确设置了工具链和生成器。Qt项目有时需要特定的配置,尤其是跨平台如iOS,可能需要指定工具链文件或者正确的CMake参数。 可能的解决步骤包括: 1. 清理构建目录,删除CMakeCache.txt和其他生成的文件。 2. 明确指定生成器为Xcode,使用命令行参数。 3. 确保Xcode版本与CMake兼容,特别是用户提到的Xcode 1.5可能是个旧版本,需要检查是否受支持。 4. 检查Qt的配置是否正确,特别是iOS构建可能需要额外的设置,比如工具链文件。 此外,用户可能混淆了生成器的选择,比如在命令行中应该使用-G "Xcode"来指定生成器。如果在之前构建时使用了不同的生成器,残留的文件会导致问题,所以清理是关键。 还需要注意CMake的版本是否支持所用的Xcode版本。例如,较新的CMake版本可能不支持旧版Xcode,或者反之。用户提到的错误信息中的“Xcode 1.5”可能是个笔误,因为Xcode的版本通常更大(如14或15),但如果是旧版,可能需要升级CMake或Xcode。 最后,如果用户在使用Qt的iOS构建,可能需要配置CMake时指定iOS工具链,这通常涉及设置CMAKE_SYSTEM_NAME、CMAKE_OSX_SYSROOT等变量。或者使用Qt提供的工具链文件。</think>### 分步解决方案 #### 1. **清理构建目录** CMake缓存冲突通常由残留的旧配置(如`CMakeCache.txt`)引起。彻底清除构建目录可避免生成器不匹配: ```bash rm -rf CMakeCache.txt CMakeFiles ``` 或手动删除整个构建目录后重新创建。 #### 2. **明确指定生成器** 在命令行中强制使用`Xcode`生成器: ```bash cmake -G "Xcode" [项目路径] -DCMAKE_PREFIX_PATH=[Qt安装路径] ``` 若需iOS支持,需额外指定工具链: ```bash cmake -G "Xcode" -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphoneos [项目路径] ``` #### 3. **验证Xcode与CMake兼容性** - 检查CMake版本是否支持当前Xcode版本。例如: - CMake 3.25+支持Xcode 14+ - 若Xcode过旧(如用户提到的1.5可能是误写),需升级Xcode或降级CMake[^1] - 检查Xcode命令行工具是否安装: ```bash xcode-select --install ``` #### 4. **处理Qt iOS构建的特殊配置** Qt项目需指定iOS工具链和部署目标: ```bash cmake -G "Xcode" -DCMAKE_TOOLCHAIN_FILE=[Qt安装路径]/lib/cmake/Qt5/qt_toolchain.cmake -DCMAKE_OSX_DEPLOYMENT_TARGET=15.0 [项目路径] ``` #### 5. **强制重新生成缓存** 若问题仍存在,使用`--fresh`参数(CMake 3.24+): ```bash cmake --fresh -G "Xcode" [项目路径] ``` ### 关键命令示例 ```bash # 完整流程示例 mkdir build && cd build rm -rf * cmake -G "Xcode" -DCMAKE_PREFIX_PATH=/opt/Qt/6.5.0/ios -DCMAKE_SYSTEM_NAME=iOS .. ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Taiga_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值