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
版本兼容性
| 版本 | 状态 | 引入 | 弃用 | 备注 |
|---|---|---|---|---|
| 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.
官方文档
https://cmake.org/cmake/help/latest/policy/CMP0074.html解决方案
-
通过在导出和导入项目的顶层 CMakeLists.txt 中在任何目标创建之前添加 `cmake_policy(SET CMP0074 NEW)`,确保两个项目中策略 CMP0074 都设置为 NEW。
-
在目标定义周围使用 `cmake_policy(PUSH)` 和 `cmake_policy(POP)` 隔离策略设置,确保导出看到与导入项目相同的作用域。
-
使用 `export(TARGETS mylib FILE "${CMAKE_BINARY_DIR}/MyLibConfig.cmake")` 重新生成导出配置文件,在调用 export() 之前设置一致的策略。
无效尝试
常见但无效的做法:
-
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.
-
Removing export() or install(EXPORT) from CMakeLists.txt
90% 失败
Removing the export() call entirely avoids the error but breaks the intended package distribution.
-
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.