CMake Warning (dev) at /opt/ros/foxy/share/ament_cmake_core/cmake/core/python.cmake:22 (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): /opt/ros/foxy/share/ament_cmake_core/cmake/core/all.cmake:53 (include) /opt/ros/foxy/share/ament_cmake_core/cmake/ament_cmake_core-extras.cmake:17 (include) /opt/ros/foxy/share/ament_cmake_core/cmake/ament_cmake_coreConfig.cmake:41 (include) /opt/ros/foxy/share/ament_cmake/cmake/ament_cmake_export_dependencies-extras.cmake:15 (find_package) /opt/ros/foxy/share/ament_cmake/cmake/ament_cmakeConfig.cmake:41 (include) CMakeLists.txt:19 (find_package) This warning is for project developers. Use -Wno-dev to suppress it.
时间: 2025-07-11 16:04:46 浏览: 4
<think>嗯...用户想解决ROSFoxy环境中CMake策略CMP0148的警告问题,这应该和他之前讨论的CMake版本兼容性问题有关。用户给出了两个引用片段:第一个是编译ROS多线程示例时出现的ament_cmake缺失错误;第二个明确指出这是因为ROS2代码仍在使用CMake已弃用的FindPython模块,而用户安装了较新的CMake3.30导致报错。从技术细节看,核心矛盾在于:ROSFoxy设计时CMake3.12-3.26还能容忍旧策略,但CMake3.27+彻底移除了对FindPythonInterp/Libs的支持。用户现在需要的不是简单消除警告,而是让ROS2的构建系统能兼容现代CMake。用户可能已经尝试过基础方法,现在需要更深入的解决方案。考虑到他正在开发ROS项目,构建稳定性比单纯消除警告更重要。我应该在保持系统可构建的前提下,提供分级解决方案:-最快捷的方法是临时降级CMake策略(他引用2里提到的OLD策略设置)-中等方案是锁定CMake版本(避免后续兼容问题)-更彻底的方案是尝试更新ament_cmake(但需注意Foxy是LTS版本,官方可能不会主动适配)需要特别注意提醒用户:在构建ROS时混用不同策略级别可能引发连锁反应,最好统一整个工作空间的策略设置。另外Python路径问题在现代CMake里应该通过find_package(PythonCOMPONENTSInterpreterDevelopment)解决,但修改ROS的CMakeLists需要谨慎。用户似乎对CMake机制有一定了解(能精确提到CMP0148),但可能不熟悉ROS构建系统的内部细节。我该强调哪些操作最安全,并解释原理让他能举一反三。</think>
在 ROS Foxy 中使用 `ament_cmake_core` 时遇到 **CMake Policy CMP0148 警告** 的根本原因及解决方案如下:
---
### **问题原因**
CMake 3.12+ 开始弃用 `FindPythonInterp` 和 `FindPythonLibs` 模块,而 **ROS Foxy 的 `ament_cmake_core` 仍依赖这些旧模块**。当您使用较新版本的 CMake(如 3.27+)时:
1. CMake 默认策略 `CMP0148=NEW` **强制禁止使用弃用模块**,触发警告或错误。
2. ROS 构建系统调用旧模块时被新策略拦截,导致编译中断(如引用中提到的 `find_package(ament_cmake)` 失败)。
---
### **解决方案**
#### 方法一:**显式降级策略 (推荐)**
在构建命令中强制指定策略为 `OLD`,兼容 ROS Foxy 的旧模块调用:
```bash
colcon build --cmake-args -DCMAKE_POLICY_DEFAULT_CMP0148=OLD
```
**原理**:
通过 `-DCMAKE_POLICY_DEFAULT_CMP0148=OLD` 覆盖默认策略,允许继续使用 `FindPythonInterp/Libs`(此时 CMake 仅输出警告而非报错)。
#### 方法二:**锁定 CMake 版本 (长期兼容)**
降级 CMake 到 **与 ROS Foxy 兼容的版本**(如 3.16-3.26):
```bash
# Ubuntu 示例 (安装 CMake 3.22)
sudo apt remove cmake
sudo apt install cmake=3.22.*
```
#### 方法三:**修改源码策略 (高级)**
在 ROS 包的 `CMakeLists.txt` 开头添加:
```cmake
# 强制当前文件使用 OLD 策略
if(POLICY CMP0148)
cmake_policy(SET CMP0148 OLD)
endif()
```
---
### **根本解决建议**
1. **ROS Foxy 官方限制**:
Foxy 为 LTS 版本,核心工具链(包括 `ament_cmake`)**不会主动适配 CMake 新策略**,需长期依赖降级策略[^2]。
2. **升级 ROS 版本**:
若项目允许,迁移至 **ROS Humble (2026年EOL)** 或更新的 Rolling 版本,已原生支持 `CMP0148=NEW`。
---
### **操作验证**
运行以下命令检查策略是否生效:
```bash
colcon build --cmake-args -DCMAKE_POLICY_DEFAULT_CMP0148=OLD --event-handlers console_direct+
```
观察输出中是否仍出现 `FindPythonInterp` 相关报错。若无报错且编译成功,则策略已生效。
---
阅读全文
相关推荐



















