CMake编译触发Resource deadlock avoided错误的解决求助
排查Make编译时的"Resource deadlock avoided"错误
错误信息
make[2]: *** CMakeFiles/exec.dir/compiler_depend.make: Resource deadlock avoided. Stop. make[1]: *** [CMakeFiles/Makefile2:84: CMakeFiles/exec.dir/all] Error 2 make: *** [Makefile:91: all] Error 2
环境信息
- M2 Macbook Pro、MacOS Sonoma
- Docker Desktop 4.25.1、Ubuntu 22.04.2 LTS
- cmake 3.22.1、gcc (Ubuntu 11.3.0-1ubuntu1~22.04.1) 11.3.0
问题背景
执行make命令时频繁触发上述错误,仅重新执行cmake ..可临时解决,怀疑错误与Docker容器或OpenMP编译选项有关。
相关代码
CMakeLists.txt
# Set the version of CMake required cmake_minimum_required(VERSION 3.14) # Set the project name and the language used project(ARModel CXX) # Create an executable and specify the source files add_executable(exec predict.cpp AR.cpp) # Include path target_include_directories(exec PUBLIC /usr/include/python3.10) # Specify the library directory link_directories(/usr/lib/python3.10) # Create a shared library add_library(cnpy SHARED "cnpy/cnpy.cpp") # Link the libraries target_link_libraries(exec PUBLIC python3.10 cnpy z) # Set the linker library search policy if(COMMAND cmake_policy) cmake_policy(SET CMP0003 NEW) endif(COMMAND cmake_policy) # Set compiler options set(CMAKE_NO_CACHE TRUE) set(CMAKE_C_COMPILER "gcc") set(CMAKE_CXX_COMPILER "g++") set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_FLAGS "-std=c++20 -O3 -fopenmp -mtune=native -march=native -I/usr/include/python3.10")
Makefile(关键片段)
# All Build rule for target. CMakeFiles/exec.dir/all: CMakeFiles/cnpy.dir/all $(MAKE) $(MAKESILENT) -f CMakeFiles/exec.dir/build.make CMakeFiles/exec.dir/depend $(MAKE) $(MAKESILENT) -f CMakeFiles/exec.dir/build.make CMakeFiles/exec.dir/build @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir="/workspaces/AR model/cpp/build/CMakeFiles" --progress-num=3,4,5,6 "Built target exec" .PHONY : CMakeFiles/exec.dir/all
根本原因分析
- CMake依赖生成死锁:错误来自
compiler_depend.make,说明CMake在生成依赖文件时发生资源竞争死锁。并行编译(如make -j)时,若依赖关系处理不当,加上Docker容器内文件系统的锁机制限制,容易触发这类问题。 - CMake配置不规范:全局设置
CMAKE_CXX_FLAGS会覆盖默认编译选项,破坏依赖计算逻辑;CMAKE_NO_CACHE TRUE强制每次重新生成构建文件,大幅增加资源竞争概率;全局link_directories可能导致依赖解析混乱。 - 架构与环境冲突:M2的arm64架构若搭配x86_64的Ubuntu容器(QEMU模拟),会导致编译器依赖生成行为异常,加剧资源占用和死锁风险。
- OpenMP的间接影响:
-fopenmp引入额外编译依赖,当CMake重新生成依赖时,与正在运行的make进程产生资源竞争。
解决方法
1. 修正CMakeLists.txt配置
- 替换全局编译选项为目标级设置:避免覆盖默认逻辑,减少依赖计算错误
# 移除原有的set(CMAKE_CXX_FLAGS ...) target_compile_options(exec PRIVATE -O3 -fopenmp -mtune=native -march=native ) # 无需重复指定-std=c++20,CMAKE_CXX_STANDARD已设置 - 调整链接与包含路径为目标绑定:
# 替换全局link_directories为目标级设置 target_link_directories(exec PRIVATE /usr/lib/python3.10) # 若仅exec需要该头文件,改用PRIVATE而非PUBLIC target_include_directories(exec PRIVATE /usr/include/python3.10) - 移除CMAKE_NO_CACHE设置:让CMake正常使用缓存管理依赖,减少重复生成带来的竞争
2. 避免并行编译的依赖竞争
执行make时先串行处理依赖,再并行编译:
make -j1 depend && make -j$(nproc)
或者在CMake中强制直接生成依赖文件:
set(CMAKE_DEPENDS_USE_COMPILER FALSE)
3. 优化Docker环境
- 使用Docker卷代替绑定挂载目录,避免宿主机与容器的文件锁冲突
- 启动容器时提高文件描述符上限:
docker run --ulimit nofile=65535:65535 ... - 确保使用arm64版本的Ubuntu镜像,避免QEMU模拟带来的性能和资源问题
4. 验证编译器与CMake兼容性
更新CMake到3.24+版本(Ubuntu 22.04可通过apt安装新版本),修复旧版本中依赖生成的已知bug:
apt update && apt install -y cmake-data cmake
内容的提问来源于stack exchange,提问作者bike
相关产品推荐
相关产品推荐

