Windows10安装Ceres-solver遇路径超限,CMAKE_OBJECT_PATH_MAX设置无效
问题场景
- 工作用Windows 10电脑受系统MAX_PATH(260字符)限制,无法修改系统上限
- 编译Ceres-solver时,CMake生成的文件路径过长,示例路径:
build\internal\ceres\ba_iterschur_acceleratesparse_clustjacobi_auto_threads_test.dir\Release\ba_iters.5B2CC283.tlog\ba_iterschur_acceleratesparse_clustjacobi_auto_threads_test.lastbuildstate - 编译时报错:
C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild\Microsoft\VC\v160\Microsoft.CppBuild.targets(382,5): error MSB3491: Could not write lines to file "ba_iterschur_acceleratesparse_clustjacobi_auto_threads_test.dir\Release\ba_iters.5B2CC283.tlog\ba_iterschur_acceleratesparse_clustjacobi_auto_threads_test.lastbuildstate". Path: ba_iterschur_acceleratesparse_clustjacobi_auto_threads_test.dir\Release\ba_iters.5B2CC283.tlog\ba_iterschur_acceleratesparse_clustjacobi_auto_threads_test.lastbuildstate exceeds the OS max path limit. The fully qualified file name must be less than 260 characters. [R:\Data\ceres4\ceres-solver\build-x64-Dynamic\internal\ceres\generated_bundle_adjustment_tests\ba_iterschur_acceleratesparse_clustjacobi_auto_threads_test.vcxproj]
已尝试的无效方法
在Ceres-solver的CMakeLists.txt中添加以下代码,但未解决问题:
if (WIN32) set(CMAKE_OBJECT_PATH_MAX 260 CACHE INTERNAL "Max path length") message(STATUS "CMAKE_OBJECT_PATH_MAX is set to: ${CMAKE_OBJECT_PATH_MAX}") endif()
该值已写入CMakeCache.txt:
//Max path length CMAKE_OBJECT_PATH_MAX:INTERNAL=260
可行解决方案
1. 缩短根目录路径
将Ceres-solver源码和编译build目录移到磁盘根目录下的短路径中,例如:
- 源码目录:
C:\ceres\ - 编译目录:
C:\ceres-build\
直接减少基础路径长度,从根源避免后续生成文件的路径超出260字符限制。
2. 关闭测试编译(最有效)
在CMake配置时添加参数,关闭自动生成测试目标——这类超长路径大多来自自动生成的测试文件(如报错中的ba_iterschur_xxx测试):
-DCERES_BUILD_TESTS=OFF -DCERES_BUILD_EXAMPLES=OFF -DCMAKE_BUILD_TYPE=Release
同时可附加参数缓解文件写入问题:
-DCMAKE_CXX_FLAGS="/FS"
3. 手动缩短测试目标名称(需保留测试时用)
如果必须保留测试功能,找到Ceres-solver中生成长名称测试的脚本(通常在internal/ceres/generated_bundle_adjustment_tests/目录下的CMake文件),将自动生成的测试名称手动缩短,比如把ba_iterschur_acceleratesparse_clustjacobi_auto_threads_test改为ba_schur_test,减少路径中的字符数。
4. 使用NTFS符号链接缩短路径
以管理员权限打开命令提示符,为长路径的源码目录创建短名称符号链接:
mklink /D C:\ceres "R:\Data\ceres4\ceres-solver"
之后在C:\ceres-build\目录下执行CMake配置和编译,编译时实际使用短路径规避MAX_PATH限制。
内容的提问来源于stack exchange,提问作者Hendrik

