由于权限问题,CMake 测试编译在 docker 容器上失败

问题描述 投票:0回答:1

我有一个 gitlab CI 管道,它在 Windows docker 容器中构建我的软件,这工作得很好,直到我将 cpr 添加到我的项目中。

在 cpr 的配置步骤中,在

check_cxx_source_runs("int main() { return 0; }" THREAD_SANITIZER_AVAILABLE)
中调用
cpr/cmake/sanitizer.cmake
在此阶段,配置步骤失败并出现以下错误:

CMake Error at C:/Program Files/CMake/share/cmake-3.27/Modules/Internal/CheckSourceRuns.cmake:93 (try_run):
  The file:
    C:/builds/<project>/build/CMakeFiles/CMakeScratch/TryCompile-ito77w/Debug/cmTC_4dfe8.exe
  could not be removed:
    Access is denied.
Call Stack (most recent call first):
  C:/Program Files/CMake/share/cmake-3.27/Modules/CheckCXXSourceRuns.cmake:52 (cmake_check_source_runs)
  build/_deps/cpr-src/cmake/sanitizer.cmake:13 (check_cxx_source_runs)
  build/_deps/cpr-src/CMakeLists.txt:55 (include)

我的理解是编译器能够生成测试可执行文件,但随后它尝试清理并且无法删除它创建的文件。

到目前为止我尝试过的:

  • 检查 CI 管道中的用户:
    echo "$(whoami)"
    ->
    user manager\containeradministrator
  • 设置 CMake 标志以避免编译器检查
    CMAKE_CXX_COMPILER_WORKS=1, CMAKE_C_COMPILER_WORKS=1
  • 将测试目标更改为静态库
    CMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY
  • 删除 gitlab 运行器缓存

我开始陷入一个让我感觉不舒服的兔子洞,因为我对 Docker 和 Windows 权限系统的经验很少,所以如果有人有想法,我会很乐意在我破坏一切之前接受它:)

c++ docker cmake build continuous-integration
1个回答
0
投票

我可以通过将

--debug-trycompile
添加到 cmake 参数来解决此问题,这具有不删除 TryCompile/* 目录的副作用。

© www.soinside.com 2019 - 2024. All rights reserved.