CMake Warning (dev) at cmake/OpenCVUtils.cmake:146 (find_package): Policy CMP0148 is not set: The FindPythonInterp and FindPythonLibs modules are removed. Run "cmake --help-policy CMP0148" for policy details. Use the cmake_policy command to set the policy and suppress this warning. Call Stack (most recent call first): cmake/OpenCVDetectPython.cmake:64 (find_host_package) cmake/OpenCVDetectPython.cmake:271 (find_python) CMakeLists.txt:649 (include) This warning is for project developers. Use -Wno-dev to suppress it.
时间: 2025-07-04 12:48:11 浏览: 9
<think>嗯,用户遇到了CMake的CMP0148策略警告,需要解决这个问题。首先,我得回忆一下CMP0148是什么。CMake的策略通常和兼容性或者废弃的功能有关。根据用户提到的find_pythoninterp和find_pythonlibs被移除,这可能是因为在较新的CMake版本中,这些旧模块被弃用了,转而推荐使用FindPython模块。
查找一下CMake的文档,CMP0148确实涉及到FindPythonInterp和FindPythonLibs的移除。当用户升级CMake到3.27或更高版本时,这些旧模块不再可用,所以需要迁移到新的FindPython方法。用户需要修改他们的CMakeLists.txt文件,将find_package(PythonInterp)和find_package(PythonLibs)替换为find_package(Python COMPONENTS Interpreter Development)。
接下来,用户可能不知道如何具体修改代码。例如,原来的变量如PYTHON_EXECUTABLE现在应该用Python_EXECUTABLE代替,而PYTHON_INCLUDE_DIRS和PYTHON_LIBRARIES则会被Python_INCLUDE_DIRS和Python_LIBRARIES取代。此外,如果用户需要同时支持新旧CMake版本,他们可能需要条件判断,根据CMake版本来选择使用旧的还是新的模块。
另外,用户提到的策略警告可能需要在CMakeLists.txt开头设置策略CMP0148为NEW,这样可以消除警告。例如,添加if(POLICY CMP0148)和cmake_policy(SET CMP0148 NEW)这样的代码。同时,确保cmake_minimum_required的版本足够高,或者至少设置为支持新策略的版本,比如3.27或更高。
可能用户的项目中还依赖其他第三方库,比如pybind11,这些库可能还在使用旧的FindPythonInterp方法,这时候需要更新这些依赖库的版本,或者手动修改它们的CMakeLists.txt文件,类似用户之前处理CMP0127的策略问题一样。
最后,测试修改后的CMake配置是否正常工作,确保所有Python相关的路径和库都正确找到,项目能够成功构建。如果用户遇到其他问题,可能需要进一步调整变量名或路径设置。</think>### 解决方案:CMake CMP0148警告的修复方法
CMake的`CMP0148`策略警告源于旧版`FindPythonInterp`和`FindPythonLibs`模块的移除[^2][^4]。以下是逐步解决方法:
---
#### 步骤 1:理解警告原因
- **触发条件**:CMake >=3.27版本中,`FindPythonInterp`和`FindPythonLibs`模块被废弃,改用统一的`FindPython`模块[^2]。
- **典型报错**:`find_package(PythonInterp)`或`find_package(PythonLibs)`时出现策略警告。
---
#### 步骤 2:修改CMakeLists.txt
将旧版Python检测逻辑替换为新的`FindPython`语法:
```cmake
# 旧语法(触发CMP0148警告)
find_package(PythonInterp REQUIRED)
find_package(PythonLibs REQUIRED)
# 新语法(兼容CMP0148)
find_package(Python COMPONENTS Interpreter Development REQUIRED)
```
---
#### 步骤 3:更新变量引用
替换旧版变量名以适配新模块:
- `PYTHON_EXECUTABLE` → `Python_EXECUTABLE`
- `PYTHON_INCLUDE_DIRS` → `Python_INCLUDE_DIRS`
- `PYTHON_LIBRARIES` → `Python_LIBRARIES`
例如:
```cmake
include_directories(${Python_INCLUDE_DIRS})
target_link_libraries(your_target ${Python_LIBRARIES})
```
---
#### 步骤 4:强制策略兼容(可选)
在CMakeLists.txt开头添加策略设置:
```cmake
if(POLICY CMP0148)
cmake_policy(SET CMP0148 NEW) # 强制使用新策略
endif()
```
---
#### 步骤 5:验证构建
重新运行CMake生成命令:
```bash
cmake .. -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_BUILD_TYPE=Debug # 参考用户环境[^3]
```
---
### 补充说明
- **多版本兼容**:若需支持CMake <3.27,可通过条件分支处理:
```cmake
if(CMAKE_VERSION VERSION_LESS 3.27)
find_package(PythonInterp REQUIRED)
find_package(PythonLibs REQUIRED)
else()
find_package(Python COMPONENTS Interpreter Development REQUIRED)
endif()
```
- **第三方库适配**:若依赖库(如pybind11)触发此警告,需更新其CMake脚本或手动添加策略覆盖[^1][^4]。
---
阅读全文
相关推荐















