You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

根本原因分析

  1. CMake依赖生成死锁:错误来自compiler_depend.make,说明CMake在生成依赖文件时发生资源竞争死锁。并行编译(如make -j)时,若依赖关系处理不当,加上Docker容器内文件系统的锁机制限制,容易触发这类问题。
  2. CMake配置不规范:全局设置CMAKE_CXX_FLAGS会覆盖默认编译选项,破坏依赖计算逻辑;CMAKE_NO_CACHE TRUE强制每次重新生成构建文件,大幅增加资源竞争概率;全局link_directories可能导致依赖解析混乱。
  3. 架构与环境冲突:M2的arm64架构若搭配x86_64的Ubuntu容器(QEMU模拟),会导致编译器依赖生成行为异常,加剧资源占用和死锁风险。
  4. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 13:44:53