CMake Error: Target "mylib" has policy scope mismatch when exporting. Policy CMP0074 is not set.
ID: cmake/exported-target-policy-scope-mismatch
Version Compatibility
| Version | Status | Introduced | Deprecated | Notes |
|---|---|---|---|---|
| CMake 3.12 | active | — | — | — |
| CMake 3.18 | active | — | — | — |
| CMake 3.22 | active | — | — | — |
Root Cause
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中文
通过 install(EXPORT) 或 export() 导出目标时,目标目录级别的策略设置与导入项目的策略范围不同,导致 CMake 拒绝导出以防止行为不一致。
Official Documentation
https://cmake.org/cmake/help/latest/policy/CMP0074.htmlWorkarounds
-
85% success Ensure that the policy CMP0074 is set to NEW in both the exporting and importing projects by adding `cmake_policy(SET CMP0074 NEW)` in the top-level CMakeLists.txt before any target creation.
Ensure that the policy CMP0074 is set to NEW in both the exporting and importing projects by adding `cmake_policy(SET CMP0074 NEW)` in the top-level CMakeLists.txt before any target creation.
-
80% success Use `cmake_policy(PUSH)` and `cmake_policy(POP)` around the target definition to isolate policy settings, ensuring the export sees the same scope as the importing project.
Use `cmake_policy(PUSH)` and `cmake_policy(POP)` around the target definition to isolate policy settings, ensuring the export sees the same scope as the importing project.
-
75% success Regenerate the exported configuration file using `export(TARGETS mylib FILE "${CMAKE_BINARY_DIR}/MyLibConfig.cmake")` with a consistent policy set before calling export().
Regenerate the exported configuration file using `export(TARGETS mylib FILE "${CMAKE_BINARY_DIR}/MyLibConfig.cmake")` with a consistent policy set before calling export().
中文步骤
通过在导出和导入项目的顶层 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() 之前设置一致的策略。
Dead Ends
Common approaches that don't work:
-
Using cmake_policy(SET CMP0074 OLD) to force old behavior
65% fail
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% fail
Removing the export() call entirely avoids the error but breaks the intended package distribution.
-
Manually duplicating target definition in importing project
80% fail
Copying the target's CMakeLists.txt into the importing project manually may resolve the immediate error but creates maintenance burden and duplicates code.