CMP0074 cmake build_error ai_generated true

CMake 错误:导出目标 "mylib" 时策略范围不匹配。未设置策略 CMP0074。

CMake Error: Target "mylib" has policy scope mismatch when exporting. Policy CMP0074 is not set.

ID: cmake/exported-target-policy-scope-mismatch

其他格式: JSON · Markdown 中文 · English
80%修复率
82%置信度
1证据数
2024-01-10首次发现

版本兼容性

版本状态引入弃用备注
CMake 3.12 active
CMake 3.18 active
CMake 3.22 active

根因分析

通过 install(EXPORT) 或 export() 导出目标时,目标目录级别的策略设置与导入项目的策略范围不同,导致 CMake 拒绝导出以防止行为不一致。

English

When exporting a target via install(EXPORT) or export(), the target's directory-level policy settings differ from the importing project's policy scope, causing CMake to reject the export to prevent inconsistent behavior.

generic

官方文档

https://cmake.org/cmake/help/latest/policy/CMP0074.html

解决方案

  1. 通过在导出和导入项目的顶层 CMakeLists.txt 中在任何目标创建之前添加 `cmake_policy(SET CMP0074 NEW)`,确保两个项目中策略 CMP0074 都设置为 NEW。
  2. 在目标定义周围使用 `cmake_policy(PUSH)` 和 `cmake_policy(POP)` 隔离策略设置,确保导出看到与导入项目相同的作用域。
  3. 使用 `export(TARGETS mylib FILE "${CMAKE_BINARY_DIR}/MyLibConfig.cmake")` 重新生成导出配置文件,在调用 export() 之前设置一致的策略。

无效尝试

常见但无效的做法:

  1. Using cmake_policy(SET CMP0074 OLD) to force old behavior 65% 失败

    Setting cmake_policy(SET CMP0074 OLD) in the exporting project may suppress the error but can lead to subtle build failures in the importing project.

  2. Removing export() or install(EXPORT) from CMakeLists.txt 90% 失败

    Removing the export() call entirely avoids the error but breaks the intended package distribution.

  3. Manually duplicating target definition in importing project 80% 失败

    Copying the target's CMakeLists.txt into the importing project manually may resolve the immediate error but creates maintenance burden and duplicates code.